Bike老爷问了好几天到底要怎样简单的题目你们才能AK啊终于在他每天降难度直到要走了才出了一套我们能AK的题。虽然前几天的题换成llj肯定随便AK。

其实最近有点方虽然通常最后都写完了把该拿的分拿了该拍的拍了,但是并不是很顺利的那种前30min切了T1,再1h切t2拍了最后写t3然后拍这样,这套题推了半天t1没推出来就弃了去搞t2,结果半天把fwt打挂了又去搞t3,开考1h多终于把t3搞出来了才又去回想我的fwt,最后1h先猜了个t1的结论然后先想打个树dp之类的验证发现不会,又证了半天才勉强觉得是对的。t3还没有拍,交题的时候都很虚。如果是正式的考场,特别是像noip比较简单的,这种情况我可能心态就崩了,别说AK,一不小心爆个0也不是不可能。但总得来说先通读题每道有个大概的想法和及时弃题不要对着一个狂肝其他该要的分都不要(去年能要是明白这个道理我大概就不在这里了吧)应该是没错的,然后心态要稳这样?

B 君的第一题hohhot

结论题。画一条链,发现胜负只跟最上面一条边有关,画一朵菊花,发现答案就是和根相连的所有边的异或和。大胆地猜测,这是个结论。考虑和根相连只有一条边的情况,任何一次操作都会改变这条边,那么胜负只跟这条边原本的状态有关。如果根有多条边相连,那么每条边底下的操作情况互不影响,答案就是每条边的答案的异或和。

 //Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,a[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} #define ANS
int main() {
#ifdef ANS
freopen("hohhot.in","r",stdin);
freopen("hohhot.out","w",stdout);
#endif
read(n);
For(i,,n) {
int x,y,z;
read(x); read(y); read(z);
a[x]^=z; a[y]^=z;
}
For(i,,n) printf("%d\n",a[i]);
Formylove;
}

B 君的第二题lhasa

这不是一道FWT的裸题么,毕老爷给的标答也就是换一种方式的各种集合变换,和FWT也差不到哪去吧,我觉得noip不会考。。

 //Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,k,a[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL f[N],b[N];
void FWT(int n,int F) {
for(int i=;i<n;i<<=)
for(int j=,pp=(i<<);j<n;j+=(pp))
for(int k=;k<i;k++) {
LL x=f[j+k],y=f[j+k+i];
if(F==) f[j+k+i]=x+y;
else f[j+k+i]=y-x;
} } #define ANS
int main() {
#ifdef ANS
freopen("lhasa.in","r",stdin);
freopen("lhasa.out","w",stdout);
#endif
read(n); read(k);
For(i,,n) {
read(a[i]);
f[a[i]]++;
}
int up=(<<k);
For(i,,up) b[i]=f[i];
FWT(up,);
For(i,,up) f[i]=f[i]*f[i];
FWT(up,-);
For(i,,up) f[i]=(f[i]-b[i])/;
//For(i,0,up-1) printf("%lld ",f[i]); puts("");
For(i,,k-) {
Rep(s,up-,) if(!(s&(<<i)))
f[s]+=f[s|(<<i)];
}
For(s,,up-) printf("%lld\n",f[s]);
Formylove;
}

B 君的第三题urumqi

并查集+set启发式合并,之前讲过的一道题。

我开了两个并查集,一个并查集维护和我相同集合的元素,一个并查集维护每个集合不能有的元素。每个集合的每个并查集开个set。

合并的时候启发式合并,不等关秀就在每个集合不能有的元素的set里放进一个对面集合的代表元。相等关系我处理的比较暴力,不管怎么样先合并(启发式)再说,合并到一半发现冲突就把这部分合并都撤销了输出NO否则最终合并完输出YES,因为有撤销操作所以大概要用multiset。

 //Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,sz,x[N],y[N],o[N],ls[N];
int sta[N],top,sta2[N],top2;
int fa[][N];
multiset<int>s1[N],s2[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int find(int x,int f) { return x==fa[f][x]?x:fa[f][x]=find(fa[f][x],f); } #define ANS
int main() {
#ifdef ANS
freopen("urumqi.in","r",stdin);
freopen("urumqi.out","w",stdout);
#endif
read(n);
For(i,,n) {
read(x[i]); read(y[i]); read(o[i]);
ls[++ls[]]=x[i];
ls[++ls[]]=y[i];
}
sort(ls+,ls+ls[]+);
sz=unique(ls+,ls+ls[]+)-(ls+);
For(i,,n) {
x[i]=lower_bound(ls+,ls+sz+,x[i])-ls;
y[i]=lower_bound(ls+,ls+sz+,y[i])-ls;
}
For(i,,sz) {
fa[][i]=i;
fa[][i]=i;
s1[i].insert(i);
}
For(i,,n) {
int u1=find(x[i],),v1=find(x[i],);
int u2=find(y[i],),v2=find(y[i],);
if(o[i]) {
if(u1==u2) puts("Yes");
else {
int fl=;
if(s1[u1].size()<s1[u2].size()) swap(u1,u2),swap(v1,v2);
fa[][u2]=u1;
top=;
while(s1[u2].size()) {
int tp=*s1[u2].begin();
if(s2[v1].find(tp)!=s2[v1].end()) {
while(top) {
int t=sta[top--];
s1[u2].insert(t);
s1[u1].erase(t);
}
fl=;
break;
}
s1[u2].erase(s1[u2].begin());
sta[++top]=tp;
s1[u1].insert(tp);
}
if(!fl) {
int tpfl=;
if(s2[v1].size()<s2[v2].size()) { tpfl=; swap(u1,u2),swap(v1,v2); }
fa[][v2]=v1;
top2=;
while(s2[v2].size()) {
int tp=*s2[v2].begin();
if(s1[u1].find(tp)!=s1[u1].end()) {
while(top) {
int t=sta[top--];
if(!tpfl) {
s1[u2].insert(t);
s1[u1].erase(t);
}
else {
s1[u1].insert(t);
s1[u2].erase(t);
}
}
while(top2) {
int t=sta2[top2--];
s2[v2].insert(t);
s2[v1].erase(s2[v1].find(t));
}
}
s2[v2].erase(s2[v2].begin());
sta2[++top2]=tp;
s2[v1].insert(tp);
}
}
if(fl) {
puts("No");
fa[][u1]=u1; fa[][u2]=u2;
fa[][v1]=v1; fa[][v2]=v2;
}
else puts("Yes");
}
}
else {
if(u1==u2) puts("No");
else {
puts("Yes");
s2[v1].insert(u2);
s2[v2].insert(u1);
}
}
}
Formylove;
}

最新文章

  1. hdu 3401 单调队列优化DP
  2. WebAPI返回数据类型解惑[转]
  3. javascript 位运算
  4. 在DB2 for z/os上创建指定pagesize的数据库
  5. CentOS6.4 配置Tengine
  6. codeforces 70D Professor&#39;s task(动态二维凸包)
  7. python正则表达式介绍
  8. 学习zepto.js(原型方法)
  9. 杭州电ACM1098——Ignatius&amp;#39;s puzzle
  10. 《Hexo+github搭建个人博客》
  11. 16. 使用Exhibitor管理ZooKeeper
  12. Android 最简单的测试UI卡顿
  13. [Swift]LeetCode235. 二叉搜索树的最近公共祖先 | Lowest Common Ancestor of a Binary Search Tree
  14. 用php实现斐波那契数列,如: 1, 1, 2, 3, 5, 8, 13, 21, 34。用数组求出第20个数的值。
  15. 必做作业3:原型化设计:地铁扫码app
  16. 错误模块名称: KERNELBASE.dll错误
  17. You Only Look Once: Unified, Real-Time Object Detection(翻译)
  18. 剑指Offer(四):重建二叉树
  19. 如何使用navicat远程连接服务器上的oracle数据库
  20. springboot入门之简单demo

热门文章

  1. Python之-爬虫
  2. Kali Linux下运行nfc工具测试!
  3. 学号 20175223 《Java程序设计》第10周学习总结
  4. linux下lamp.sh一键配置lamp环境流程
  5. ANSI 标准C 还定义了如下几个宏
  6. Area的使用
  7. 运维 03 Linux之文档与目录结构
  8. 牛客练习赛53 C 富豪凯匹配串
  9. python面试题之如何解决验证码的问题,用什么模块,听过哪些人工打码平台?
  10. Spring定时器StopWatch