首页 > 代码库 > NOIP 0924 水题记
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 long17 #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 long17 #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 }
这场题出的质量相当不错,没有小结辣,滚去上课。
NOIP 0924 水题记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。