19-11-08-+
$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\n",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\n",i);
return;
}
else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){
printf("%d\n",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\n",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\n",i);
return 0;
}
else if(!is_del[aq.top().id] && aq.top().up+pos>=hei){
printf("%d\n",i);
return 0;
}
pos+=dq.top().up;
if(pos>=hei){
printf("%d\n",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题解吗
Miemeng真的蒻

浙公网安备 33010602011771号