NOIP 0924 水题记

这场貌似是gcd专场?

第一题很有意思,模拟gcd的过程即可。

 1 //0924 candy
 2 //by Cydiater
 3 //2016.9.24
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <queue>
10 #include <map>
11 #include <ctime>
12 #include <cmath>
13 #include <cstdlib>
14 #include <iomanip>
15 using namespace std;
16 #define ll long long
17 #define up(i,j,n)        for(int i=j;i<=n;i++)
18 #define down(i,j,n)        for(int i=j;i>=n;i--)
19 #define FILE "candy"
20 const ll MAXN=1e6+5;
21 const ll oo=10000000LL;
22 inline ll read(){
23     char ch=getchar();ll x=0,f=1;
24     while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
25     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
26     return x*f;
27 }
28 ll N,M,flag,ans=0,cnt=0;
29 priority_queue<ll>A,B;
30 namespace solution{
31     ll gcd(ll a,ll b){
32         if(b==0)return a;
33         ans+=a/b*b;
34         return gcd(b,a%b);
35     }
36     void init(){
37         N=read();M=read();flag=read();
38     }
39     void slove(){
40         gcd(max(N,M),min(N,M));
41         cout<<ans<<endl;
42         if(flag==1){
43             up(i,1,M)A.push(N);
44             up(i,1,N)B.push(M);
45             while(1){
46                 if(A.size()==0||B.size()==0)break;
47                 if(A.size()>B.size())swap(A,B);
48                 ll len=A.size();
49                 up(i,1,len){
50                     int num=B.top();B.pop();
51                     int tmp=A.top();A.pop();
52                     if(tmp-num!=0)A.push(tmp-num);
53                     printf("%d ",num);
54                 }
55             }
56             puts("");
57         }
58     }
59 }
60 int main(){
61     freopen(FILE".in","r",stdin);
62     freopen(FILE".out","w",stdout);
63     using namespace solution;
64     init();
65     slove();
66     return 0;
67 }

第三题刚开始想到了$O(MN^2)$的算法,不甘心拿40分,也许70分可以用莫队xjb搞搞?

然后没想出来莫队,想出正解辣

其实就是玩玩前缀和什么的。

 1 //0924 gcd
 2 //by Cydiater
 3 //2016.9.24
 4 #include <iostream>
 5 #include <cstring>
 6 #include <iomanip>
 7 #include <cstdio>
 8 #include <cstdlib>
 9 #include <string>
10 #include <algorithm>
11 #include <queue>
12 #include <map>
13 #include <ctime>
14 #include <cmath>
15 using namespace std;
16 #define ll long long
17 #define up(i,j,n)        for(int i=j;i<=n;i++)
18 #define down(i,j,n)        for(int i=j;i>=n;i--)
19 #define FILE "gcd"
20 const ll MAXN=1e6+5;
21 const ll oo=0x3f3f3f3f;
22 const ll mod=1LL<<31;
23 inline ll read(){
24     char ch=getchar();ll x=0,f=1;
25     while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
26     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
27     return x*f;
28 }
29 ll N,g[MAXN],c[MAXN],d[MAXN],gcd[MAXN],cd[MAXN],gc[MAXN],M,ans;
30 char s[MAXN];
31 namespace solution{
32     void init(){
33         scanf("%s",s+1);
34         N=strlen(s+1);
35     }
36     void pret(){
37         memset(g,0,sizeof(g));memset(c,0,sizeof(c));memset(d,0,sizeof(d));
38         memset(gc,0,sizeof(gc));memset(cd,0,sizeof(cd));memset(gcd,0,sizeof(gcd));
39         down(i,N,1){
40             g[i]=g[i+1]+(s[i]==‘g‘?1:0);
41             c[i]=c[i+1]+(s[i]==‘c‘?1:0);
42             d[i]=d[i+1]+(s[i]==‘d‘?1:0);
43         }
44         down(i,N,1){
45             cd[i]=(cd[i+1]+(s[i]==‘c‘?d[i]:0))%mod;
46             gc[i]=(gc[i+1]+(s[i]==‘g‘?c[i]:0))%mod;
47         }
48         down(i,N,1)gcd[i]=(gcd[i+1]+(s[i]==‘g‘?cd[i]:0))%mod;
49     }
50     void slove(){
51         M=read();
52         while(M--){
53             ll leftt=read(),rightt=read();
54             if(leftt>rightt)swap(leftt,rightt);
55             ans=(gcd[leftt]-gcd[rightt+1]+mod)%mod;
56             ll tmp_gc=(gc[leftt]-gc[rightt+1]+mod)%mod;
57             tmp_gc=(tmp_gc-((g[leftt]-g[rightt+1])*c[rightt+1])%mod+mod)%mod;
58             ans=(ans-(tmp_gc*d[rightt+1])%mod+mod)%mod;
59             ans=(ans-((g[leftt]-g[rightt+1])*cd[rightt+1])%mod+mod)%mod;
60             printf("%d\n",(int)ans);
61         }
62     }
63 }
64 int main(){
65     freopen(FILE".in","r",stdin);
66     freopen(FILE".out","w",stdout);
67     using namespace solution;
68     init();
69     pret();
70     slove();
71     return 0;
72 }

T2做到现在很不爽,到现在也就照着标程抄了抄,没理解为什么。

  1 //NOIp 0924 pod
  2 //by Cydiater
  3 //2016.9.24
  4 #include <iostream>
  5 #include <cstring>
  6 #include <cstdlib>
  7 #include <cstdio>
  8 #include <queue>
  9 #include <map>
 10 #include <ctime>
 11 #include <cmath>
 12 #include <iomanip>
 13 #include <algorithm>
 14 #include <string>
 15 using namespace std;
 16 #define ll long long
 17 #define up(i,j,n)        for(int i=j;i<=n;i++)
 18 #define down(i,j,n)        for(int i=j;i>=n;i--)
 19 #define FILE "pod"
 20 const int MAXN=1e6+5;
 21 const int oo=0x3f3f3f3f;
 22 inline int read(){
 23     char ch=getchar();int x=0,f=1;
 24     while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
 25     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
 26     return x*f;
 27 }
 28 int N,M,Q,LINK[MAXN],len=0,f[MAXN],f2[MAXN],tol[MAXN];
 29 struct edge{
 30     int x,y,next,v;
 31 }e[MAXN<<1];
 32 bool OK[MAXN];
 33 namespace solution{
 34     inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;e[len].x=x;}
 35     int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
 36     int getf(int k){
 37         if(f[k]==k)        return k;
 38         f[k]=getf(f[k]);
 39         return f[k];
 40     }
 41     int getf2(int k){
 42         if(f2[k]==k)        return k;
 43         f2[k]=getf2(f2[k]);
 44         return f2[k];
 45     }
 46     void merge(int x,int y,int v){
 47         x=getf(x);y=getf(y);
 48         if(tol[x]!=0)v=gcd(v,tol[x]);
 49         if(tol[y]!=0)v=gcd(v,tol[y]);
 50         tol[x]=v;f[y]=x;
 51     }
 52     int merge2(int x,int y,int v){
 53         if(v==1){
 54             if(getf2(x)==getf2(y))        return 0;
 55             f2[getf2(x)]=getf2(y+N);
 56             f2[getf2(y)]=getf2(x+N);
 57         }else{
 58             if(getf2(x)==getf2(y+N))    return 0;
 59             f2[getf2(x)]=getf2(y);
 60             f2[getf2(x+N)]=getf2(y+N);
 61         }
 62         return 1;
 63     }
 64     void init(){
 65         N=read();M=read();Q=read();
 66         memset(tol,0,sizeof(tol));
 67         up(i,1,N){
 68             f[i]=i;f2[i]=i;
 69             f2[i+N]=i+N;
 70         }
 71         up(i,1,M){
 72             int x=read(),y=read(),v=read();
 73             insert(x,y,v);insert(y,x,v);
 74             merge(x,y,v);
 75         }
 76         up(i,1,M<<1){
 77             int x=e[i].x,y=e[i].y,v=e[i].v;
 78             int d=tol[getf(e[i].x)];
 79             int flag=merge2(x,y,(v/d)%2);
 80             if(!flag)OK[getf(x)]=1;
 81             i+=1;
 82         }
 83     }
 84     void slove(){
 85         while(Q--){
 86             int x=read(),y=read(),K=read();
 87             if(getf(x)!=getf(y))        puts("NIE");//unconnect
 88             else{
 89                 int d=gcd(K,tol[getf(x)]);
 90                 if((K/d)&1)                            puts("0");
 91                 else{
 92                     if(OK[getf(x)])                    puts("0");
 93                     else{
 94                         if(getf2(x)==getf2(y))        puts("0");//same color
 95                         else                          printf("%d\n",d);
 96                     }
 97                 }
 98             }
 99         }
100     }
101 }
102 int main(){
103     freopen(FILE".in","r",stdin);
104     freopen(FILE".out","w",stdout);
105     using namespace solution;
106     init();
107     slove();
108     return 0;
109 }

这场题出的质量相当不错,没有小结辣,滚去上课。

时间: 2024-10-16 12:46:14

NOIP 0924 水题记的相关文章

刷水题记(1)

嗯,看到最近yyl大神刷了很多题(lzw大神也是),于是我翻开他们的记录,轻轻点开他们刷过的题(这句话似曾相识?)妈旦这么水的题我竟然没过!!!,然后有了这篇文. 第一题,最大连续子序列之和 良心锑星题,然后我很开心的把它艹过去了嗯. #include <cstdio> int f,i,j,n,m,p; int main(){ m=1<<31; scanf("%d",&n); for(i=0;i<n;++i){ scanf("%d&quo

51nod水题记

妈呀51nod已经刷不动了又开始跟bzoj一样总是得看题解了...那么发一下总结吧... 1051:最大子矩阵 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t

刷水题记(2)

看了看提交记录,有一堆小高一在做题... 然后开始快乐地刷那些我没有刷过的水题啦啦啦~~ 第一题 蟠桃记 恩简单递推. #include <cstdio> int main(){ int a,i,n; scanf("%d",&n); a=1; for(i=1;i<n;++i) a=(a+1)<<1; printf("%d\n",a); return 0; } 第二题 得票查询 一个个数过来,真·良心水题推荐 #include &

NOIp模拟赛 旅游

很神奇的一道题,金策大爷给的题解: 什么叫神犇什么叫蒟蒻? IOI冠军的一句基本相同让我思考了一下午. 看完了题解我就想都没想开始用遍历二分图搞,但是搞到了65分后就总是会WA掉7组. 然后仔细的看了看std,位运算上对几处做了常数上的优化,读起来异常麻烦,到最后看懂他在干什么了.但是总是不理解. 下午浪费了两节英语课思考原理,总之想明白了. 我简单说一下我的想法. 首先考虑如果一条路径的所有边权的gcd为$d$,那么不管正着走反着走或者绕上几圈,其总路径和一定为$kd$,$k$为任意正整数.

2014-11-3 NOIP模拟赛2

NOIP 2014 水题模拟赛 (请选手务必仔细阅读本页内容) 一.题目概况 中文题目名称 数列 刷漆 排队 英文题目与子目录名 seq paint layout 可执行文件名 seq paint layout 输入文件名 seq.in paint.in layout.in 输出文件名 seq.out paint.out layout.out 每个测试点时限 2 秒 1 秒 1 秒 测试点数目 10 10 10 每个测试点分值 10 10 10 附加样例文件 无 无 无 结果比较方式 全文比较(

哦 NOIP

NOIP 除了水题我写了两天暴力(从NOIP感冒到现在我人不是很好)总体来说两天的1.2题都很简单.理论上DAY1 第三题也很水,是一道可做性极强的无限背包,但是可能我DP熟练度不够,没想到正解.70分的暴力.听说 DAY2 第三题可以黑,2~20个质数hash一下可以胡搞毛搞70分,又听说费马小优化一下,双hash可以自信AC 哦,考试的时候又没想通,感觉很有道理.50分高精度暴力(当时目测了一下神犇的FFT好像是70). 需要更多的刷题,算法储量不足,O_o,←_←后面就是丧狂的省选了,直视

NOIP2013转圈游戏

不得不说NOIP的水题就是牛! 题目简述:给你n个人(0 - n-1) 组成一个环,每次一起前进m步,问编号为x的人在移动了10 ^ k后,他的位置是什么 咱家还能说啥,假设我们把它拉成一个无限长的链,那么每m个长度就是一圈,所以答案就是 (x + m * 10 ^ k) % n 接下来就是快速幂了,记得要时时模就好了,轻松水过~~ #include <algorithm> #include <iostream> #include <cstring> #include

NOIp2014 解题报告

有史以来第一届面向社会征题的NOIp结束了.最开始以为面向社会征题会很难,但是这是我参加的最水的一次NOIp了. 由于停了两月的课,所以现在正在补文化科目就没时间打代码了.所以所有的题目就均不给出代码了啦啦啦~为了方便没有参加NOIP的童鞋们我把题目网址放到了每道题题解的最后. 晚了两周的题解如下: Day1T1 生活大爆炸版石头剪刀布 我就不说了..近几年来NOIp最水的第一题(我会告诉你我去年第一题用的是30分算法?)我们这里有一位小伙伴本地测试AC,但是官方爆0了.我们特意下载了NOI L

历年NOIP水题泛做

快noip了就乱做一下历年的noip题目咯.. noip2014 飞扬的小鸟 其实这道题并不是很难,但是就有点难搞 听说男神错了一个小时.. 就是$f_{i,j}$表示在第$i$个位置高度为$j$的时候最小点击次数 递推的话对于上升的情况只做一次,后面几次在后面再做.. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace st