QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#321854 | #7036. Can You Solve the Harder Problem? | zxcen | AC ✓ | 1694ms | 105356kb | C++17 | 3.1kb | 2024-02-05 18:44:27 | 2024-02-05 18:44:28 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5;
struct QUE{
int l,r;
};
int T;
int n;
ll a[N+10];
vector<QUE>que[N+10];
struct SGT{
struct node{
ll rv,sum,cov;
}tree[(N+10)<<2];
inline void cover(int rt,int l,int r,ll x){
tree[rt].rv=x;
tree[rt].sum=(r-l+1)*x;
tree[rt].cov=x;
}
inline void pushup(int rt){
tree[rt].rv=tree[rt<<1|1].rv;
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
inline void pushdown(int rt,int l,int r){
if(tree[rt].cov){
int mid=(l+r)>>1;
cover(rt<<1,l,mid,tree[rt].cov);
cover(rt<<1|1,mid+1,r,tree[rt].cov);
tree[rt].cov=0;
}
}
inline void init(int l,int r,int rt){
tree[rt]={0,0,0};
if(l==r){
return ;
}
int mid=(l+r)>>1;
init(l,mid,rt<<1);
init(mid+1,r,rt<<1|1);
}
inline int find(int l,int r,ll x,int rt){
if(l==r){
return l;
}
pushdown(rt,l,r);
int mid=(l+r)>>1;
if(tree[rt<<1].rv<x){
return find(l,mid,x,rt<<1);
}
else if(tree[rt<<1|1].rv<x){
return find(mid+1,r,x,rt<<1|1);
}
return 0;
}
inline void update(int l,int r,int pl,int pr,ll x,int rt){
if(pl<=l&&r<=pr){
cover(rt,l,r,x);
return ;
}
pushdown(rt,l,r);
int mid=(l+r)>>1;
if(pl<=mid){
update(l,mid,pl,pr,x,rt<<1);
}
if(pr>mid){
update(mid+1,r,pl,pr,x,rt<<1|1);
}
pushup(rt);
}
inline ll query(int l,int r,int pl,int pr,int rt){
if(pl<=l&&r<=pr){
return tree[rt].sum;
}
pushdown(rt,l,r);
int mid=(l+r)>>1;
ll res=0;
if(pl<=mid){
res+=query(l,mid,pl,pr,rt<<1);
}
if(pr>mid){
res+=query(mid+1,r,pl,pr,rt<<1|1);
}
return res;
}
}sgt;
struct SAM{
int idx=0,lst=0;
unordered_map<ll,int>son[(N+10)<<1];
int link[(N+10)<<1]={-1},len[(N+10)<<1],ep[(N+10)<<1];
inline void insert(ll num,int pos){
int u=++idx,v=lst;
son[u].clear();
len[u]=len[lst]+1;
ep[u]=pos;
while(~v&&!son[v][num]){
son[v][num]=u;
v=link[v];
}
if(~v){
int w=son[v][num];
if(len[w]!=len[v]+1){
int x=++idx;
son[x].clear();
for(auto k:son[w]){
son[x][k.first]=k.second;
}
link[x]=link[w];
len[x]=len[v]+1;
ep[x]=pos;
while(~v&&son[v][num]==w){
son[v][num]=x;
v=link[v];
}
link[u]=x;
link[w]=x;
}
else{
link[u]=w;
}
}
else{
link[u]=0;
}
lst=u;
}
inline void init_que(){
for(int i=1;i<=idx;++i){
que[ep[i]].push_back({ep[i]-len[i]+1,ep[i]-len[link[i]]});
}
}
}sam;
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
}
sam.idx=0;
sam.lst=0;
sam.son[0].clear();
for(int i=1;i<=n;++i){
sam.insert(a[i],i);
}
for(int i=1;i<=n;++i){
que[i].clear();
}
sam.init_que();
sgt.init(1,n,1);
ll ans=0;
for(int i=1;i<=n;++i){
int pos=sgt.find(1,n,a[i],1);
if(1<=pos&&pos<=i){
sgt.update(1,n,pos,i,a[i],1);
}
for(auto x:que[i]){
ans+=sgt.query(1,n,x.l,x.r,1);
}
}
cout<<ans<<'\n';
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 7ms
memory: 31680kb
input:
2 3 1 2 3 3 2 3 3
output:
14 14
result:
ok 2 lines
Test #2:
score: 0
Accepted
time: 1495ms
memory: 105356kb
input:
1000 407 205460 200518 200561 199235 198814 198136 198802 206763 198795 200705 205862 209366 204017 209481 206300 198499 197364 200897 208928 196983 205605 206396 205140 201050 199886 207314 196947 207905 204999 203288 200298 198594 198286 197714 206506 203962 197628 201127 206380 199090 200711 2063...
output:
17377263880 484769420621 1469039857 473739194467 490764968536 305434410403 488123854116 494441224927 484272937511 482411215077 34438338505 225764586244 494494400870 492874976740 486779601551 483167680203 341192630235 492747353987 491280077388 9765154255 491745355442 120812820486 487737922489 4725166...
result:
ok 1000 lines
Test #3:
score: 0
Accepted
time: 1602ms
memory: 93692kb
input:
1000 989 507102 732180 353998 101710 542881 118374 431064 689823 413523 117027 629973 750571 190925 749991 433716 360981 112209 548712 201721 316123 391501 242087 419388 181933 456503 655757 417087 739256 442318 78753 243152 491702 215002 645259 568188 663372 389158 380483 792508 586353 739459 90306...
output:
454746757256 28339718425 453884630039 128591729064 448111178045 75284968670 445747071452 279896702194 445704609778 167973786530 371872311621 70407640704 428085383449 147419726815 282581591005 445036870282 198428498846 802046 455258988212 196913576758 21403552866 424994895807 188380097 448477259353 3...
result:
ok 1000 lines
Test #4:
score: 0
Accepted
time: 1694ms
memory: 94680kb
input:
1000 982 590062 597319 244109 393500 687086 311683 519273 222529 165273 443310 33318 251697 850506 177933 423587 60261 567513 185789 315612 389005 173138 466085 358614 249736 451662 287939 154325 674678 302122 631230 72255 586340 454064 425737 424534 726084 45495 607376 248020 509440 122093 701062 5...
output:
428903041682 465564876399 448066404349 437820728634 453686981834 433070617806 187074086885 450111902263 463869202505 125071818152 448570062058 441205083218 456280814880 421177986909 2089294777 279427869076 444963732958 475010632100 450118276001 9994609936 436741023150 456098463889 17896078275738529 ...
result:
ok 1000 lines
Test #5:
score: 0
Accepted
time: 1649ms
memory: 91896kb
input:
1000 985 372606 380156 684655 641468 555433 141926 469854 168775 303961 679291 178219 572619 281395 343523 756186 666170 749512 788286 463868 110160 864845 220706 847501 30848 482661 58326 888652 655505 733551 195467 488714 19609 571337 2327 793288 93419 348702 159592 376399 553701 90541 374944 5081...
output:
450803381706 438582982237 440295491979 449150481542 448335033699 64578055878 465937363239 37665830325 219124838416 465658512161 58052329213 453065801876 444369207459 61516176426 201637236439 194444511404 14273492638 464013523017 43346256749 552428282 3953219456 73155598864 5017635401 38965458377 108...
result:
ok 1000 lines