2018HDU多校day1
1001(打表/不定方程)
这个可以直接打表。。然后发现。。如果不能被3或者4整除就是-1。。
然后被3整除一定是x=y=z=n/3(废话),否则被4整除一定是x=y=z/2=n/4。。
然后是严格证明。。
令u=n/x,v=n/y,w=n/z
有1/u+1/v+1/w=1
假设u<=v<=w,则u<=3
当u=2,1/v+1/w=1/2,v=w=4或w=3,v=6
当u=3,1/v+1/w=2/3,v=w=3
就只有这3种取法。。然后u=2,w=3,v=6如果能满足一定能满足3|n了。。直接取均值,可排除。。
/** * ┏┓ ┏┓ ┏┛┗━━━━━━━┛┗━━━┓ ┃ ┃ ┃ ━ ┃ ┃ > < ┃ ┃ ┃ ┃... ⌒ ... ┃ ┃ ┃ ┗━┓ ┏━┛ ┃ ┃ Code is far away from bug with the animal protecting ┃ ┃ 神兽保佑,代码无bug ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗━━━┓ ┃ ┣┓ ┃ ┏┛ ┗┓┓┏━━━━━━━━┳┓┏┛ ┃┫┫ ┃┫┫ ┗┻┛ ┗┻┛ */ include<cstdio> include<cstring> include<algorithm> include<iostream> include<queue> include<cmath> include<map> include<stack> include<set> define inc(i,l,r) for(int i=l;i<=r;i++) define dec(i,l,r) for(int i=l;i>=r;i--) define link(x) for(edge *j=h[x];j;j=j->next) define mem(a) memset(a,0,sizeof(a)) define ll long long define eps 1e-12 define succ(x) (1<<x) define lowbit(x) (x&(-x)) define sqr(x) ((x)*(x)) define mid (x+y>>1) define NM 1000005 define nm 2000005 define N 1000005 define M(x,y) x=max(x,y) const double pi=acos(-1); const ll inf=998244353; using namespace std; ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x10+ch-'0',ch=getchar(); return fx; } ll n; int main(){ int =read();while(--){ n=read(); if(n%3==0)n/=3,printf("%lld\n",nnn); else if(n%4==0)n/=4,printf("%lld\n",nnn*2); else printf("-1\n"); } return 0; }
1002(6299)Balanced Sequence
题解:可以通过类似栈的操作把序列化成')))))','((((((',')))))((((('这样的三种形式,然后对于这个pair(a,b)按照玄学规则排序就OK(G++T了C++就过了)
#include <iostream> #include <algorithm> #include <string> const int MAXN=1e5+10; const int maxn=5e6+10; using namespace std; string s[MAXN]; char str[maxn]; typedef struct node{ int h1,h2,id; friend bool operator<(node aa,node bb){ if(min(aa.h1,bb.h2)==min(aa.h2,bb.h1))return aa.h1<bb.h2; return min(aa.h1,bb.h2)>min(aa.h2,bb.h1); } }node; node d[MAXN]; /*bool cmp(node aa,node bb){ if(min(aa.h1,bb.h2)==min(aa.h2,bb.h1))return aa.h1<bb.h2; return min(aa.h1,bb.h2)>min(aa.h2,bb.h1); }*/ int main(){ //int _;cin>>_; ios::sync_with_stdio(false); int _;cin>>_; while(_--){ int n;cin>>n; for(int i=1;i<=n;i++)cin>>s[i]; int ans=0; for(int i=1;i<=n;i++){ int _t=s[i].size(); d[i].h1=d[i].h2=0;d[i].id=i; for(int j=0;j<_t;j++){ if(s[i][j]=='(')d[i].h1++; else{ if(d[i].h1>0)d[i].h1--; else{d[i].h2++;} } } } sort(d+1,d+n+1); // sort(d+1,d+n+1); int cnt=0; for(int i=1;i<=n;i++){ int _t=s[d[i].id].length(); for(int j=0;j<_t;j++)str[++cnt]=s[d[i].id][j]; } int a1=0,b1=0; for(int i=1;i<=cnt;i++){ if(str[i]=='(')a1++; else{ if(a1)a1--,ans++; else b1++; } /* ans+=2*min(b1,d[i].h2); b1-=min(b1,d[i].h2); b1+=d[i].h1;*/ } ans*=2; cout<<ans<<endl; // for(int i=1;i<=n;i++)s[i].clear(); } return 0; }
1003(模拟)
模拟一下发现可以从左往右取,如果有x相同的可以取y最大或者y最小的。
/** * ┏┓ ┏┓ ┏┛┗━━━━━━━┛┗━━━┓ ┃ ┃ ┃ ━ ┃ ┃ > < ┃ ┃ ┃ ┃... ⌒ ... ┃ ┃ ┃ ┗━┓ ┏━┛ ┃ ┃ Code is far away from bug with the animal protecting ┃ ┃ 神兽保佑,代码无bug ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗━━━┓ ┃ ┣┓ ┃ ┏┛ ┗┓┓┏━━━━━━━━┳┓┏┛ ┃┫┫ ┃┫┫ ┗┻┛ ┗┻┛ */ include<cstdio> include<cstring> include<algorithm> include<iostream> include<queue> include<cmath> include<map> include<stack> include<set> define inc(i,l,r) for(int i=l;i<=r;i++) define dec(i,l,r) for(int i=l;i>=r;i--) define link(x) for(edge *j=h[x];j;j=j->next) define mem(a) memset(a,0,sizeof(a)) define ll long long define eps 1e-12 define succ(x) (1<<x) define lowbit(x) (x&(-x)) define sqr(x) ((x)*(x)) define mid (x+y>>1) define NM 1000005 define nm 2000005 define N 1000005 define M(x,y) x=max(x,y) const double pi=acos(-1); const ll inf=998244353; using namespace std; ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x10+ch-'0',ch=getchar(); return fx; } struct P{ int x,y,i; bool operator<(const P&o){return x<o.x||(x==o.x&&y<o.y);} }a[NM]; int n; int main(){ int =read();while(--){ n=read()*3; inc(i,1,n)a[i].x=read(),a[i].y=read(),a[i].i=i; sort(a+1,a+1+n); inc(i,1,n){ if(i%3)printf("%d ",a[i].i);else printf("%d\n",a[i].i); } } }
1004(6301)Distinct Values
题解:找到每个位置被限制的最左端点的位置 然后求这个区间的mex 弱鸡写了主席树做法 双制作+set的并没有想到
#include <bits/stdc++.h> const int MAXN=1e5+10; using namespace std; typedef struct node{ int l,r,vis;int len; }node; node d[MAXN*21];int rt[MAXN]; int cnt; void update(int &x,int y,int l,int r,int t){ x=++cnt;d[x]=d[y];d[x].len++; // cout<<l<<"===----"<<r<<endl; if(l==r){ //if(!d[x].vis)d[x].len=1,d[x].vis=1; return ; } int mid=(l+r)>>1; if(t<=mid)update(d[x].l,d[y].l,l,mid,t); else update(d[x].r,d[y].r,mid+1,r,t); d[x].len=d[d[x].l].len+d[d[x].r].len; // cout<<l<<" "<<r<<" "<<d[x].len<<endl; } int ans; void querty(int x,int y,int l,int r){ if(l==r){ans=l;return ;} int mid=(l+r)>>1; // cout<<l<<"===="<<r<<" "<<d[d[y].l].len<<" "<<d[d[x].l].len<<endl; if(d[d[y].l].len-d[d[x].l].len!=mid-l+1)querty(d[x].l,d[y].l,l,mid); else querty(d[x].r,d[y].r,mid+1,r); } typedef struct Q{ int l,r; friend bool operator<(Q aa,Q bb){ if(aa.l==bb.l)return aa.r>bb.r; return aa.l<bb.l; } }Q; Q que[MAXN]; int ans1[MAXN],pre[MAXN]; int main(){ int _;scanf("%d",&_); while(_--){ int n,m;scanf("%d%d",&n,&m); cnt=0; for(int i=1;i<=m;i++)scanf("%d%d",&que[i].l,&que[i].r); sort(que+1,que+m+1); int be=1; for(int i=1;i<=m;i++){ while(be<que[i].l)pre[be]=0,ans1[be]=1,be++; while(be<=que[i].r)pre[be]=que[i].l,be++; } for(;be<=n;be++)pre[be]=0,ans1[be]=1; // for(int i=1;i<=n;i++)cout<<pre[i]<<" "; // cout<<endl; int l=1;ans=1;int r=0; for(int i=1;i<=m;i++){ while(l<que[i].l)ans1[l]=1,rt[l]=rt[l-1],l++; r=0; while(l<=que[i].r){ querty(rt[que[i].l-1],rt[l-1],1,n);ans1[l]=ans; // cout<<l<<":::::"<<ans<<endl; update(rt[l],rt[l-1],1,n,ans); // cout<<"--------"<<endl; l++; } } for(;l<=n;l++)ans1[l]=1; for(int i=1;i<=n;i++){if(i==1)printf("%d",ans1[i]);else printf(" %d",ans1[i]);} printf("\n"); } }
1007队友博客https://blog.csdn.net/qkoqhh/article/details/81181298
1008(6305) RMQ Similar Sequence
题解:http://tokitsukaze.live/2018/07/23/hdu6305/
大佬的博客有详细题解 简单说只要证明B数组是一个排列 后面的做法就很显然...分治+st表
/*#include <algorithm> #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #pragma comment(linker, "/STACK:1024000000,1024000000")*/ #include <bits/stdc++.h> #define ll long long using namespace std; const int MAXN=1e6+10; const ll mod=1e9+7; //int n; /*ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; }*/ struct FastIO { static const int S=200; int wpos; char wbuf[S]; FastIO():wpos(0){} inline int xchar() { static char buf[S]; static int len=0,pos=0; if(pos==len) pos=0,len=fread(buf,1,S,stdin); if(pos==len) exit(0); return buf[pos++]; } inline int read() { int s=1,c=xchar(),x=0; while(c<=32) c=xchar(); if(c=='-') s=-1,c=xchar(); for(;'0'<=c&&c<='9';c=xchar()) x=x*10+c-'0'; return x*s; } ~FastIO() { if(wpos) fwrite(wbuf,1,wpos,stdout),wpos=0; } }io; ll ksm(ll a,ll b){ ll ans=1ll; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod;b>>=1; } return ans; } int a[MAXN];int pos[MAXN][22]; int mu[22],ma[MAXN];ll fav[MAXN],sum[MAXN]; int pmin(int aa,int bb){ if(a[aa]==a[bb])return min(aa,bb); return a[aa]>a[bb]?aa:bb; } void St(int n){ for(int i=1;i<=n;i++){pos[i][0]=i; for(int j=1;i+(1<<(j-1))<=n+1;j++)pos[i][j]=0; } for(int j=1;mu[j-1]<=n;j++){ for(int i=1;i+mu[j]<=n+1;i++){ int t=mu[j-1]; // if(dp[i][j-1]==dp[i+mu[j-1]][j-1])dp[i][j]=dp[i][j-1],pos[i][j]=min(dp[i][j-1],dp[i+mu[j-1]][j-1]); // else if(dp[i][j-1]>dp[i+mu[j-1]][j-1])dp[i][j]=dp[i][j-1],pos[i][j]=pos[i][j-1]; // else dp[i][j]=dp[i+mu[j-1]][j-1],pos[i][j]=pos[i+mu[j-1]][j-1]; pos[i][j]=pmin(pos[i][j-1],pos[i+t][j-1]); } } } int rmq(int l,int r){ // int k=ma[r-l+1]; int j=(int)(log10(r-l+1)/log10(2))+1; int i=r-(1<<(j-1))+1; return pmin(pos[l][j-1],pos[i][j-1]); // if(dp[l][k]==dp[r-mu[k]+1][k])return min(pos[l][k],pos[r-mu[k]+1][k]); // else if(dp[l][k]>dp[r-mu[k]+1][k])return pos[l][k]; // else return pos[r-mu[k]+1][k]; // return pmin(pos[l][k],pos[r-mu[k]+1][k]); } ll C(int nn,int mm){ //ll ret=1; if(mm<nn||nn<0) return 0; return fav[nn]*fav[mm-nn]%mod*sum[mm]%mod; } namespace DFS { struct node{int l,r;}; int top; node st[MAXN]; ll dfs(int mn,int mx) { ll res=1; int l,r; l=mn; r=mx; top=0; st[top].l=l; st[top++].r=r; while(top) { l=st[top-1].l; r=st[--top].r; if(l>=r) continue; int pos=rmq(l,r); // res*=fav[p-l];res%=mod;res*=fav[r-p];res%=mod;res*=sum[r-l];res%=mod; res=res*C(pos-l,r-l)%mod; st[top].l=l; st[top++].r=pos-1; st[top].l=pos+1; st[top++].r=r; } return res; } } /*ll C(ll n,ll m){ if(n>m) return 0; ll a=1,b=1; for(int i=m;i>=m-n+1;i--) a=a*i%mod; for(int i=1;i<=n;i++) b=b*i%mod; return (a*(ksm(b,mod-2)%mod)%mod); } ll Lucas(ll n,ll m){ if(n==0) return 1; return (1ll*C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod; }*/ int p; ll dfs(int l,int r){ //cout<<l<<" "<<r<<endl; if(l>=r)return 1LL; // cout<<l<<" "<<r<<" "<<p<<endl; p=rmq(l,r); // cout<<l<<" "<<r<<" "<<p<<" "<<fav[p-l]<<" "<<res<<endl; // cout<<res<<endl; return dfs(l,p-1)*dfs(p+1,r)%mod*C(p-l,r-l)%mod; //dfs(rmq(l,r)+1,r); } int main(){ int _;int n; _=io.read(); mu[0]=1;//ma[0]=-1; // scanf("%d",&_); //cout<<_<<endl; for(int i=1;i<=21;i++)mu[i]=mu[i-1]*2; // for(int i=1;i<MAXN;i++)if(!(i&(i-1)))ma[i]=ma[i-1]+1;else ma[i]=ma[i-1]; sum[0]=1;fav[0]=1; for(int i=1;i<MAXN;i++)sum[i]=i*sum[i-1]%mod,fav[i]=ksm(sum[i],mod-2); //cout<<Lucas(2,3)<<endl; while(_--){ n=io.read(); // scanf("%d",&n); // memset(dp,0,sizeof(dp));memset(pos,0,sizeof(dp)); for(int i=1;i<=n;i++)a[i]=io.read(); St(n);ll ans=DFS::dfs(1,n); // cout<<res<<endl; ans*=ksm((sum[n])%mod,mod-2);ans%=mod; ans*=n;ans%=mod;ans*=ksm(2ll,mod-2);ans%=mod; printf("%lld\n",ans); } return 0; }
1011(6308)Time Zone
题解:模拟
#include <bits/stdc++.h> using namespace std; int main(){ int n;scanf("%d",&n);double t;int x,y; while(n--){ char ch='1'; scanf("%d%d",&x,&y); while((ch!='+'&&ch!='-'))ch=getchar(); scanf("%lf",&t); if(ch=='-')t*=-1; t-=8;bool flag=0; if(t<0)flag=1,t*=-1; t*=100; // cout<<t<<endl; int t3=round(t); // cout<<t3<<endl; int t1=t3/100;int t2=(t3/10-t1*10)*6; // cout<<t1<<" "<<t2<<endl; if(flag)t*=-1; if(t<0)x-=t1,y-=t2; else x+=t1,y+=t2; if(y<0)x--,y+=60; if(y>=60)x++,y-=60; if(x<0)x+=24; if(x>=24)x-=24; if(x<=9)printf("0%d:",x); else printf("%d:",x); if(y<=9)printf("0%d\n",y); else printf("%d\n",y); } return 0; }