QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#482780 | #1062. 世界地图 | QZJ123456 | 40 | 179ms | 220052kb | C++14 | 9.2kb | 2024-07-17 21:30:16 | 2024-07-17 21:30:16 |
Judging History
answer
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
unsigned int SA, SB, SC;int lim,n,m;
int getweight() {
SA ^= SA << 16;
SA ^= SA >> 5;
SA ^= SA << 1;
unsigned int t = SA;
SA = SB;
SB = SC;
SC ^= t ^ SA;
return SC % lim + 1;
}
ll dis[105][10005][2];
void init(){
int i, j, w;
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++) {
w = getweight();
dis[i][j][0]=w;
// cout<<i<<" "<<j<<" "<<0<<" "<<w<<endl;
}
for(i = 1; i < n; i++)
for(j = 1; j <= m; j++) {
w = getweight();
dis[i][j][1]=w;
// cout<<i<<" "<<j<<" "<<1<<" "<<w<<endl;
}
}
struct node{
int to;
ll val;
node(int to_,ll val_){
to=to_,val=val_;
}
};
struct bcj{
int fath[100005];
int get_fath(int i){
if(i==fath[i])return i;
return fath[i]=get_fath(fath[i]);
}
}b;
struct edge{
int x,y;
ll z;
edge(){}
edge(int x_,int y_,ll z_){
x=x_,y=y_,z=z_;
}
}arr[1005];
int tt;
bool cmp(edge x,edge y){
return x.z<y.z;
}
bool merge(int x,int y){
int fx=b.get_fath(x),fy=b.get_fath(y);
// cout<<x<<" "<<y<<" "<<fx<<" "<<fy<<endl;
if(fx==fy)return 0;
b.fath[fx]=fy;
return 1;
}
struct MST{
int nid[205],cnt;
ll ans;
vector<node>vec[405];
}suf[10005],pre[10005];
vector<node>vec1[505],vec2[505];
int fath[505][11],in[505],tim,dep[505];
ll mx[505][11];
int stk[505];
void dfs1(int now,int fa,ll val){
// cout<<now<<" "<<fa<<" "<<val<<endl;
fath[now][0]=fa;
mx[now][0]=val;
in[now]=++tim;
for(int i=1;i<=7;i++){
fath[now][i]=fath[fath[now][i-1]][i-1];
mx[now][i]=max(mx[now][i-1],mx[fath[now][i-1]][i-1]);
}
dep[now]=dep[fa]+1;
for(auto to:vec1[now]){
if(to.to==fa)continue;
dfs1(to.to,now,to.val);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=7;i>=0;i--){
if(dep[fath[x][i]]>=dep[y])x=fath[x][i];
}
if(x==y)return x;
for(int i=7;i>=0;i--){
if(fath[x][i]!=fath[y][i])x=fath[x][i],y=fath[y][i];
}
return fath[x][0];
}
ll Getdis(int x,int y){
ll res=0;
if(dep[x]<dep[y])swap(x,y);
for(int i=7;i>=0;i--){
if(dep[fath[x][i]]>=dep[y])res=max(res,mx[x][i]),x=fath[x][i];
}
if(x==y)return res;
for(int i=7;i>=0;i--){
if(fath[x][i]!=fath[y][i]){
res=max(res,mx[x][i]),x=fath[x][i];
res=max(res,mx[y][i]),y=fath[y][i];
}
}
res=max(res,mx[x][0]),res=max(res,mx[y][0]);
return res;
}
int a[205],tot,c[505],dy[505],st[505],pos[505];
bool cmp1(int x,int y){
return in[x]<in[y];
}
int main(){
// freopen("data.in","r",stdin);
// freopen("WA.out","w",stdout);
scanf("%d%d%u%u%u%d", &n, &m, &SA, &SB, &SC, &lim);
init();
pre[1].cnt=n;
for(int i=1;i<=n;i++){
pre[1].nid[i]=pre[1].nid[i+n]=i;
if(i!=n){
pre[1].vec[i].push_back(node(i+1,dis[i][1][1]));
pre[1].vec[i+1].push_back(node(i,dis[i][1][1]));
pre[1].ans+=dis[i][1][1];
}
}
for(int i=2;i<=m;i++){
tt=0;
pre[i].ans=pre[i-1].ans;
for(int j=1;j<n;j++)arr[++tt]=edge(pre[i-1].cnt+j,pre[i-1].cnt+j+1,dis[j][i][1]),pre[i].ans+=dis[j][i][1];
for(int j=1;j<=n;j++)arr[++tt]=edge(pre[i-1].cnt+j,pre[i-1].nid[j+n],dis[j][i-1][0]),pre[i].ans+=dis[j][i-1][0];
for(int j=1;j<=pre[i-1].cnt;j++){
for(auto to:pre[i-1].vec[j]){
if(j<to.to)arr[++tt]=edge(j,to.to,to.val);
}
}
sort(arr+1,arr+1+tt,cmp);
for(int j=1;j<=pre[i-1].cnt+n;j++){
pos[j]=0;
vec1[j].clear();
b.fath[j]=j;
for(int k=0;k<=7;k++)fath[j][k]=0,mx[j][k]=0;
}
for(int j=1;j<=tt;j++){
// cout<<arr[j].z<<" "<<arr[j].x<<" "<<arr[j].y<<endl;
if(merge(arr[j].x,arr[j].y)){
vec1[arr[j].x].push_back(node(arr[j].y,arr[j].z));
vec1[arr[j].y].push_back(node(arr[j].x,arr[j].z));
continue;
}
pre[i].ans-=arr[j].z;
}
// cout<<endl;
tim=0;
dfs1(1,0,0);tot=0;
// cout<<endl;
for(int j=1;j<=n;j++){
a[++tot]=pre[i-1].nid[j];
pos[a[tot]]=j;
a[++tot]=pre[i-1].cnt+j;
}
sort(a+1,a+1+tot,cmp1);
int tp=0;
st[++tp]=1;
for(int j=1;j<=pre[i-1].cnt+n;j++)c[j]=0,vec2[j].clear(),dy[j]=0;
for(int j=1;j<=tot;j++){
int l=lca(st[tp],a[j]);
// cout<<"lca:"<<st[tp]<<" "<<a[j]<<" "<<l<<endl;
if(c[l]!=i)c[l]=i;
while(1){
if(dep[st[tp-1]]<=dep[l]){
if(l!=st[tp]){
vec2[l].push_back(node(st[tp],Getdis(st[tp],l)));
vec2[st[tp]].push_back(node(l,Getdis(st[tp],l)));
}
tp--;
if(st[tp]!=l)st[++tp]=l;
break;
}
vec2[st[tp-1]].push_back(node(st[tp],Getdis(st[tp-1],st[tp])));
vec2[st[tp]].push_back(node(st[tp-1],Getdis(st[tp-1],st[tp])));
tp--;
}
if(st[tp]!=a[j])st[++tp]=a[j];
}
for(int j=1;j<tp;j++){
vec2[st[j]].push_back(node(st[j+1],Getdis(st[j+1],st[j])));
vec2[st[j+1]].push_back(node(st[j],Getdis(st[j+1],st[j])));
}
// for(int j=1;j<=4;j++){
// for(auto to:vec2[j])cout<<j<<" "<<to.to<<' '<<to.val<<endl;
// }
// cout<<endl;
for(int j=1;j<=pre[i-1].cnt+n;j++){
for(auto to:vec2[j]){
if(!dy[j]){
dy[j]=++pre[i].cnt;
if(j>pre[i-1].cnt)pre[i].nid[j-pre[i-1].cnt+n]=pre[i].cnt;
if(pos[j])pre[i].nid[pos[j]]=pre[i].cnt;
}
if(!dy[to.to]){
dy[to.to]=++pre[i].cnt;
if(to.to>pre[i-1].cnt)pre[i].nid[to.to-pre[i-1].cnt+n]=pre[i].cnt;
if(pos[to.to])pre[i].nid[pos[to.to]]=pre[i].cnt;
}
pre[i].vec[dy[j]].push_back(node(dy[to.to],to.val));
}
}
}
suf[m].cnt=n;
for(int i=1;i<=n;i++){
suf[m].nid[i]=suf[m].nid[i+n]=i;
if(i!=n){
suf[m].vec[i].push_back(node(i+1,dis[i][m][1]));
suf[m].vec[i+1].push_back(node(i,dis[i][m][1]));
suf[m].ans+=dis[i][m][1];
}
}
for(int i=m-1;i;i--){
// cout<<i<<" ";
tt=0;
suf[i].ans=suf[i+1].ans;
for(int j=1;j<n;j++)arr[++tt]=edge(suf[i+1].cnt+j,suf[i+1].cnt+j+1,dis[j][i][1]),suf[i].ans+=dis[j][i][1];
for(int j=1;j<=n;j++)arr[++tt]=edge(suf[i+1].cnt+j,suf[i+1].nid[j+n],dis[j][i][0]),suf[i].ans+=dis[j][i][0];
for(int j=1;j<=suf[i+1].cnt;j++){
for(auto to:suf[i+1].vec[j]){
if(j<to.to)arr[++tt]=edge(j,to.to,to.val);
}
}
sort(arr+1,arr+1+tt,cmp);
for(int j=1;j<=suf[i+1].cnt+n;j++){
pos[j]=0;
vec1[j].clear();
b.fath[j]=j;
for(int k=0;k<=7;k++)fath[j][k]=0,mx[j][k]=0;
}
for(int j=1;j<=tt;j++){
// if(i==m-1)cout<<arr[j].x<<" "<<arr[j].y<<" "<<arr[j].z<<endl;
if(merge(arr[j].x,arr[j].y)){
vec1[arr[j].x].push_back(node(arr[j].y,arr[j].z));
vec1[arr[j].y].push_back(node(arr[j].x,arr[j].z));
continue;
}
suf[i].ans-=arr[j].z;
}
tim=0;
dfs1(1,0,0);tot=0;
for(int j=1;j<=n;j++){
a[++tot]=suf[i+1].nid[j];
pos[a[tot]]=j;
a[++tot]=suf[i+1].cnt+j;
}
sort(a+1,a+1+tot,cmp1);
int tp=0;
st[++tp]=1;
for(int j=1;j<=suf[i+1].cnt+n;j++)c[j]=0,vec2[j].clear(),dy[j]=0;
for(int j=1;j<=tot;j++){
int l=lca(st[tp],a[j]);
if(c[l]!=i)c[l]=i;
while(1){
if(dep[st[tp-1]]<=dep[l]){
if(l!=st[tp]){
vec2[l].push_back(node(st[tp],Getdis(st[tp],l)));
vec2[st[tp]].push_back(node(l,Getdis(st[tp],l)));
}
tp--;
if(st[tp]!=l)st[++tp]=l;
break;
}
vec2[st[tp-1]].push_back(node(st[tp],Getdis(st[tp-1],st[tp])));
vec2[st[tp]].push_back(node(st[tp-1],Getdis(st[tp-1],st[tp])));
tp--;
}
if(st[tp]!=a[j])st[++tp]=a[j];
}
for(int j=1;j<tp;j++){
vec2[st[j]].push_back(node(st[j+1],Getdis(st[j+1],st[j])));
vec2[st[j+1]].push_back(node(st[j],Getdis(st[j+1],st[j])));
}
for(int j=1;j<=suf[i+1].cnt+n;j++){
for(auto to:vec2[j]){
if(!dy[j]){
dy[j]=++suf[i].cnt;
if(j>suf[i+1].cnt)suf[i].nid[j-suf[i+1].cnt+n]=suf[i].cnt;
if(pos[j])suf[i].nid[pos[j]]=suf[i].cnt;
}
if(!dy[to.to]){
dy[to.to]=++suf[i].cnt;
if(to.to>suf[i+1].cnt)suf[i].nid[to.to-suf[i+1].cnt+n]=suf[i].cnt;
if(pos[to.to])suf[i].nid[pos[to.to]]=suf[i].cnt;
}
suf[i].vec[dy[j]].push_back(node(dy[to.to],to.val));
}
}
}
// for(int i=1;i<=m;i++){
// cout<<pre[i].ans<<endl;
// for(int j=1;j<=n;j++)cout<<pre[i].nid[j]<<" ";puts("");
// for(int j=1;j<=pre[i].cnt;j++){
// for(auto to:pre[i].vec[j]){
// cout<<j<<" "<<to.to<<" "<<to.val<<endl;
// }
// }
// cout<<endl;
// }
// puts("---------");
// for(int i=m;i;i--){
// cout<<suf[i].ans<<endl;
// for(int j=1;j<=n;j++)cout<<suf[i].nid[j]<<" ";puts("");
// for(int j=1;j<=suf[i].cnt;j++){
// for(auto to:suf[i].vec[j]){
// cout<<j<<" "<<to.to<<" "<<to.val<<endl;
// }
// }
// cout<<endl;
// }
int q;
scanf("%d",&q);
while(q--){
int l,r;
scanf("%d%d",&l,&r);
tt=0;
ll ans=pre[l-1].ans+suf[r+1].ans;
for(int i=1;i<=n;i++){
ans+=dis[i][m][0];
arr[++tt]=edge(suf[r+1].nid[i]+pre[l-1].cnt,pre[l-1].nid[i],dis[i][m][0]);
}
// cout<<ans<<" ";
for(int i=1;i<=pre[l-1].cnt;i++){
for(auto to:pre[l-1].vec[i]){
if(to.to<i){
arr[++tt]=edge(i,to.to,to.val);
}
}
}
for(int i=1;i<=suf[r+1].cnt;i++){
for(auto to:suf[r+1].vec[i]){
if(to.to<i){
arr[++tt]=edge(i+pre[l-1].cnt,to.to+pre[l-1].cnt,to.val);
}
}
}
for(int i=1;i<=pre[l-1].cnt+suf[r+1].cnt;i++)b.fath[i]=i;
sort(arr+1,arr+1+tt,cmp);
for(int i=1;i<=tt;i++){
if(merge(arr[i].x,arr[i].y))continue;
ans-=arr[i].z;
}
printf("%lld\n",ans);
}
return 0;
}
詳細信息
Test #1:
score: 10
Accepted
time: 38ms
memory: 220052kb
input:
50 50 858397672 21575781 421714252 50 50 10 30 25 41 10 44 41 45 47 47 39 42 20 38 28 47 12 15 26 32 9 25 18 26 7 15 5 8 7 31 8 37 41 42 18 21 32 32 14 35 6 22 12 26 42 45 9 23 14 14 5 6 8 24 25 43 37 38 15 46 26 43 35 48 22 30 20 45 21 49 11 12 6 46 15 45 21 43 4 40 4 18 28 37 32 38 18 26 32 32 10 ...
output:
21046 24218 11414 32468 35179 33298 22126 22012 33300 30838 23977 29055 29918 33069 18185 14871 34615 32954 35312 20094 24226 25181 33130 25535 35374 34492 24067 22758 34675 13257 23443 26215 29241 17292 15165 34743 7157 13953 19672 9730 25603 29117 31267 29055 35312 8400 2536 14565 27209 33993
result:
ok 50 lines
Test #2:
score: 0
Memory Limit Exceeded
input:
100 10000 753738892 852022308 109208427 5 10000 6068 9618 3347 9710 3237 5987 428 8918 183 2017 3654 8017 6218 8094 1812 4054 783 4265 638 6139 1780 6091 1559 1706 6627 8952 2958 6234 6213 8049 1860 9764 988 8148 4992 5669 7214 9591 4245 8494 5417 9671 2840 4466 5799 8328 5436 7160 1136 1170 3134 38...
output:
1211623 682743 1361117 283679 1533910 1058719 1526089 1457348 1224581 844519 1068307 1850478 1441600 1262311 1533505 393355 533670 1750612 1431335 1079803 1078983 1572722 1403657 1554603 1871623 1742851 796103 1436810 1618909 1627701 824187 1689150 1552343 1846414 1756497 505159 1260003 174270 83303...
result:
Test #3:
score: 0
Memory Limit Exceeded
input:
100 10000 252296658 470686114 738681417 5 10000 19 9941 4573 8431 1956 8010 6495 7523 1584 9576 3805 7368 945 8568 753 6106 3261 6017 4137 4690 8260 8284 3732 7371 2222 9531 174 6288 4011 4548 7675 8100 787 5858 3504 4912 5358 9086 492 8450 4746 5765 2833 5471 6990 8945 4020 8049 2168 5355 4144 7941...
output:
14776 1154093 741074 1685175 377030 1209281 446018 873015 1360987 1773494 1873502 1195181 505818 729771 1776734 1797785 925822 1613267 1178272 383399 1687330 1382812 1510227 1121331 1279314 1165058 781005 726730 964577 989349 1175799 1824181 1485743 1279135 1225339 594598 1482362 1727286 655503 1852...
result:
Test #4:
score: 10
Accepted
time: 134ms
memory: 213300kb
input:
1 10000 171380702 78283356 95463589 1000000000 300000 2866 9527 1368 3641 8547 9622 1710 5284 3041 9484 984 9571 2839 3647 5663 8848 8026 8600 7300 9784 510 4151 3111 9321 4378 4895 990 5806 2438 3661 1680 4894 1629 3165 1982 5285 2889 7265 387 3227 669 1395 5546 6488 74 3424 270 6207 509 518 279 91...
output:
1603289365972 3725016792897 4289545851500 3090001725177 1707389603747 677676134474 4428828830089 3243732939555 4519318185589 3605953230641 3076099184075 1812557746149 4530044194578 2505624713463 4229007401433 3264345621855 4057299323184 3225483188449 2697490604818 3434409901613 4438097816271 4329018...
result:
ok 300000 lines
Test #5:
score: 10
Accepted
time: 176ms
memory: 216384kb
input:
2 10000 274134852 279286565 744539633 1000000000 300000 1457 3215 5541 7081 6313 7973 670 4949 3425 8087 6139 6619 695 3800 7532 8343 5959 7017 6912 8042 7533 8728 1224 2877 359 6569 5752 5906 1720 3244 2070 3553 4732 8576 179 551 515 8656 1962 7775 2022 9067 690 2846 2047 2671 1137 8559 1349 7168 4...
output:
5477001280973 5611523257417 5537315630440 3794711171610 3535471770801 6323223914309 4580772497023 6102708394766 5945876722548 5885604544265 5849217345115 5546619600870 2512881639605 6527329416108 5637011461020 5663080665892 4091018500635 6399362487560 1230705483628 2774960893445 1966805369253 520653...
result:
ok 300000 lines
Test #6:
score: 10
Accepted
time: 179ms
memory: 216044kb
input:
2 10000 734766235 309378503 610268282 1000000000 300000 8879 9378 26 9684 6078 8954 7926 8887 4050 7388 951 5130 1991 3091 375 5194 242 1706 1669 1727 9485 9972 5638 8314 4679 5883 4955 6823 4621 7586 348 2348 420 2340 1001 8241 5672 6005 5238 6510 1604 9325 4921 7060 20 3348 3576 9918 7655 8802 286...
output:
6316508944189 218298135044 4735457476186 6027486790948 4424182259889 3886123944524 5937796481642 3454065317288 5664230993454 6614047676609 6333322924341 4879394088851 5855623275532 5402516827740 4680300834131 5311810257921 5369465136126 1833940845223 6440262666077 5794652391437 1521847364172 5224681...
result:
ok 300000 lines
Test #7:
score: 0
Memory Limit Exceeded
input:
100 10000 784936363 827067061 800454511 1000000000 10000 2056 2962 5233 5350 1346 2099 8529 8825 2358 3371 3217 6419 1175 9635 2998 7699 1494 9244 2710 5459 1647 8372 6360 8398 1256 9955 1252 1473 4171 4704 4867 7373 3208 7839 2949 8996 4731 7531 8915 9536 2199 5546 2265 6448 1463 9131 2358 2383 625...
output:
218107916833770 236956297236591 221611594649234 232654372445039 215511117763537 163015473624889 37013079700783 127182022450125 54041351200568 173843674045542 78674875729514 191084774917088 31305721956998 234464326245872 227032500475120 179858820611878 128837146174236 94963670830748 172797399335623 2...
result:
Test #8:
score: 0
Memory Limit Exceeded
input:
100 10000 72129929 485897764 129463885 1000000000 10000 383 7372 2861 4738 5799 7101 3570 9122 3175 4173 1444 7532 6191 9348 3164 6316 2122 4663 1589 2869 4784 7741 3529 5974 4792 7378 6016 8170 864 1289 1647 7570 293 1602 1054 8521 6193 9882 4543 5121 956 5006 1858 7086 4117 7517 9736 9847 7917 865...
output:
72090982299191 194600560760132 208326087759066 106457378837533 215695913806908 93645900885474 163942628341738 164031689768437 178662309764579 208841353815076 168610752734842 180880159627225 177470699352697 187964294311616 229294854382327 97557084520879 208227727138432 60656821171511 151175099594593 ...
result:
Test #9:
score: 0
Memory Limit Exceeded
input:
100 10000 963446001 261040754 78671748 1000000000 10000 1308 8621 2948 6287 2647 3069 103 5392 3204 9085 7669 8375 2823 5662 6455 7017 530 4194 567 9892 2436 9869 3149 6625 3015 7571 1051 1155 30 5077 1138 9673 8598 9184 5453 8895 902 7796 2749 5653 334 2677 4818 7123 2693 8574 1945 2913 6278 7799 6...
output:
64264200768233 159631014825609 229412046850098 112894812377726 98703295232189 222675254882181 171598041130418 226137587624448 151655725634932 16103717296049 61433187417017 156336180363989 130459314798835 237120775693771 118682572200864 34995983081351 225547690108471 157054836420411 74239996440524 17...
result:
Test #10:
score: 0
Memory Limit Exceeded
input:
100 10000 64237141 422265017 577403465 1000000000 10000 1335 3887 3017 4150 13 5940 619 9252 2124 8016 6189 8581 3524 6793 5826 9716 880 1859 6383 6421 1312 3139 4259 6148 1005 2744 1353 8445 6463 9223 6923 9215 901 1803 1202 1820 1053 6563 3677 7206 7691 9391 4533 8068 4360 7698 4769 8394 1629 5350...
output:
178476322146618 212581735474540 97664015826725 32720953154164 98586242468815 182463260674934 161421747872055 146457120526990 216189917671016 238821446345616 195878926340178 194435416584804 198022374418219 69770884358102 173557137328055 184789377313284 218050741659725 224873943256047 107596574583740 ...