$RP++$
ZJ:
犯傻了……
T1因为暴力打错所以表也死了。
后来改对我也没再打。(我在干什么????
T2仿佛是个原题(货车运输??)蒟蒻没做过不过现在也涨知识了。
T3多测 return 0 挂15分……
43
|
Miemeng | 20
00:00:47
|
30
00:00:47
|
5
00:00:47
|
55
00:00:47
|
TJ解:
大家都AC了我写这个没意义了吧
T1:
简单打表会发现,我们的字符串的长相不会影响答案。
然后我们再简单证明一下。
我们的合法情况只有在原字符串的中间插入一些字符(或者卡在开头结尾)
那么为了防止重复,紧接着的下一个字符不能是字符串内的该位字符。
但是有一个不需要考虑,开头/结尾,不然就会因为把一种情况全部删除而容斥失败。
于是:
#include <iostream> #include <cstring> #include <cstdio> #define LL long long #define N 1111111 using namespace std; LL n,len; char st[N]; const int Mod=998244353; LL ppow(LL a,LL b){ LL res=1; if(b<0)return 0; while(b){ if(b&1)res=res*a%Mod; a=a*a%Mod; b>>=1; } return res; } int main(){ #ifndef LOCAL freopen("magic.in" ,"r",stdin); freopen("magic.out","w",stdout); #endif ios_base::sync_with_stdio(false); cin>>n>>st; len=strlen(st); cout<<(ppow(26,n)%Mod-ppow(26,n-len)%Mod-len*25%Mod*ppow(26,n-len-1)%Mod+Mod+Mod+Mod)%Mod<<endl; }
T2:
(反)货车运输。
先跑最小生成树,然后树上倍增维护边权即可!
//climb #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define N 111111 using namespace std; int dn,hei; struct YW{ int up,down; }ys[N]; int upw[N],per[N]; int ans=0x7fffffff; struct A_MAX{ int up,down,id; A_MAX(){} A_MAX(const YW a,int b){up=a.up,down=a.down,id=b;} friend bool operator < (const A_MAX &a,const A_MAX &b){ return a.up<b.up; } }; struct Del_MAX{ int up,down,id; Del_MAX(){} Del_MAX(const YW a,int b){up=a.up,down=a.down,id=b;} friend bool operator < (const Del_MAX &a,const Del_MAX &b){ return a.up-a.down<b.up-b.down; } }; bool is_del[N]; priority_queue<A_MAX>aq; priority_queue<Del_MAX>dq; namespace B_eq_0{ inline bool CMP(const YW &a,const YW &b){ return a.up>b.up; } void work(){ sort(ys+1,ys+dn+1,CMP); int pos=0,wpos=0; for(int i=1;i<=dn;i++){ pos+=ys[i].up; if(pos>=hei){ printf("%d ",i); return ; } wpos+=upw[i]; if(pos<=wpos){ puts("-1"); return ; } } puts("-1"); return ; } } namespace C_eq_0{ void work(){ for(int i=1;i<=dn;i++){ aq.push( A_MAX(ys[i],i)); dq.push(Del_MAX(ys[i],i)); } int pos=0; for(int i=1;i<=dn;i++){ while(is_del[aq.top().id] && pos+aq.top().down+dq.top().up-dq.top().down < hei){ aq.pop(); } if(is_del[aq.top().id]){ printf("%d ",i); return; } else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){ printf("%d ",i); return; } pos+=dq.top().up; pos-=dq.top().down; is_del[dq.top().id]=1; dq.pop(); } puts("-1"); return ; } } int getans(){ int pos=0,wtpos=0; for(int i=1;i<=dn;i++){ pos+=ys[per[i]].up; if(pos>=hei) return i; pos-=ys[per[i]].down; wtpos+=upw[i]; if(pos<=wtpos)return 0x7fffffff; } return 0x7fffffff; } int main(){ #ifndef LOCAL freopen("climb.in" ,"r",stdin); freopen("climb.out","w",stdout); #endif bool down_0=1,upw_0=1; scanf("%d%d",&dn,&hei); for(int i=1;i<=dn;i++){ per[i]=i; scanf("%d%d",&ys[i].up,&ys[i].down); if(ys[i].down!=0)down_0=0; } for(int i=1;i<=dn;i++){ scanf("%d",upw+i); if(upw[i]!=0)upw_0=0; } if(dn<=10){ do{ ans=min(ans,getans()); }while(next_permutation(per+1,per+dn+1)); printf("%d ",ans>dn?-1:ans); return 0; } if(down_0) B_eq_0::work(); else if(upw_0)C_eq_0::work(); else{ for(int i=1;i<=dn;i++){ aq.push( A_MAX(ys[i],i)); dq.push(Del_MAX(ys[i],i)); } int pos=0,wpos=0; for(int i=1;i<=dn;i++){ while(is_del[aq.top().id] && pos+aq.top().down+dq.top().up-dq.top().down < hei){ aq.pop(); } if(is_del[aq.top().id]){ printf("%d ",i); return 0; } else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){ printf("%d ",i); return 0; } pos+=dq.top().up; if(pos>=hei){ printf("%d ",i); return 0; } pos-=dq.top().down; wpos+=upw[i]; // cout<<pos<<" "<<wpos<<endl; if(pos<=wpos)break; is_del[dq.top().id]=1; dq.pop(); } puts("-1"); } }
T3
你见我写过T3题解吗