或许和这位错误相似,但蒟蒻甚至没有看明白他的错法(悲)
下面是我的30分代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
template <class T>void read(T &x){
x=0;
char c=getchar(),d='0';
while(c<'0'||c>'9') d=c,c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
if(d=='-') x=-x;
}
template <class T>void wt(T x){
if(x/10) wt(x/10);
putchar(x%10+'0');
}
template <class T>void enter(T x){
if(x<0) x=-x,putchar('-');
wt(x),putchar('\n');
}
template <class T>void space(T x){
if(x<0) x=-x,putchar('-');
wt(x),putchar(' ');
}
const int N=2e5+10,M=4e5+10;
int T,n,m;
struct edge_star1{
int head[N],nex[M<<1],val[M<<1],to[M<<1],tot=0;
void add(int u,int v,int w){
nex[++tot]=head[u];
head[u]=tot;
to[tot]=v;
val[tot]=w;
}
void clear(){
for(int i=1;i<=n;i++) head[i]=0;
while(tot){
nex[tot]=to[tot]=val[tot]=0;
tot--;
}
}
}e1; // e1_val => distance
int dis[N];
bool vis[N];
struct heap{
int a,b;
bool operator < (const heap p) const{
return b>p.b;
}
};
void dij(){
memset(dis,0x7f,sizeof(dis));
memset(vis,0,sizeof(vis));
priority_queue<heap> q;
dis[1]=0;
q.push((heap){1,dis[1]});
while(!q.empty()){
heap x=q.top();
int u=x.a; // wow!
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int t=e1.head[u];t;t=e1.nex[t]){
int v=e1.to[t];
if(vis[v]) continue;
if(dis[v]>dis[u]+e1.val[t]){
dis[v]=dis[u]+e1.val[t];
q.push((heap){v,dis[v]});
}
}
}
// for(int i=1;i<=n;i++) printf(" dis[%d]=%d\n",i,dis[i]);
}
struct Tree{
int head[N<<1],nex[N<<2],to[N<<2],tot=0,val[N<<1];
int t_dis[N<<1],f[N<<1][20],dep[N<<1];
void add(int u,int v){
nex[++tot]=head[u];
head[u]=tot;
to[tot]=v;
}
void clear(){
for(int i=1;i<=n*2;i++) head[i]=0,val[i]=0;
while(tot){
nex[tot]=to[tot]=0;
tot--;
}
for(int i=1;i<=n*2;i++){
dep[i]=0;
t_dis[i]=0; // ?
for(int j=0;j<=19;j++) f[i][j]=0; //...
}
}
void dfs(int pos,int fa){
dep[pos]=dep[fa]+1;
f[pos][0]=fa;
for(int i=1;i<=19;i++){
f[pos][i]=f[f[pos][i-1]][i-1];
}
if(pos<=n) t_dis[pos]=dis[pos];
else t_dis[pos]=0x7f;
for(int t=head[pos];t;t=nex[t]) dfs(to[t],pos),t_dis[pos]=min(t_dis[pos],t_dis[to[t]]);
// printf(" dfs: pos=%d,dis_min=%d\n",pos,t_dis[pos]);
// printf(" son:");
// for(int t=head[pos];t;t=nex[t]) printf(" %d",to[t]);
// putchar('\n');
}
int qry(int x,int p){
// printf(" qry:x=%d,p=%d,dep[x]=%d,find=",x,p,dep[x]);
for(int i=19;i>=0;i--){
if(dep[x]>(1<<i)&&val[f[x][i]]>p) x=f[x][i];
}
// printf("%d\n",x);
return t_dis[x];
}
}et; // reconfigurated tree
struct edge{
int u,v,dis,alt; //altitude
void input(){
read(u),read(v),read(dis),read(alt);
e1.add(u,v,dis);
e1.add(v,u,dis);
}
bool operator < (const edge b) const{
return alt>b.alt;
}
void print(){
printf("e[M]: u=%d,v=%d,dis=%d,alt=%d\n",u,v,dis,alt);
}
void clear(){
u=v=dis=alt=0;
}
}e[M];
struct UF{ // union find
int fa[N<<1];
void init(){
for(int i=1;i<=n*2;i++) fa[i]=i;
}
int find(int x){
if(x==fa[x]) return x;
fa[x]=find(fa[x]);
return fa[x];
}
void merge(int x,int y){ // x-->y (siz[x]<=siz[y])
x=find(x),y=find(y);
fa[x]=y;
}
}uf;
void reconfigurate(){
sort(e+1,e+1+m);
// for(int i=1;i<=m;i++) e[i].print();
int new_p=n+1;
uf.init();
for(int i=1;i<=m;i++){
int x=uf.find(e[i].u),y=uf.find(e[i].v);
if(x==y) continue;
uf.merge(x,new_p);
uf.merge(y,new_p);
et.add(new_p,x);
et.add(new_p,y);
et.val[new_p]=e[i].alt;
new_p++;
if(new_p==n<<1) break;
}
// printf(" come to dfs\n");
et.dfs(n*2-1,0); // ?
}
int main(){
// freopen("return.in","r",stdin);
// freopen("return.out","w",stdout);
read(T);
while(T--){
read(n),read(m);
int u,v,l,a;
for(int i=1;i<=m;i++) e[i].input();
dij();
reconfigurate();
int q,k,s,ls=0,v0,p0;
read(q),read(k),read(s);
while(q--){
read(v0),read(p0);
v0=(v0+k*ls-1)%n+1;
p0=(p0+k*ls)%(s+1);
ls=et.qry(v0,p0);
enter(ls);
}
for(int i=1;i<=m;i++) e[i].clear();
e1.clear();
et.clear();
// printf("done\n");
}
return 0;
}
/*
2
4 3
1 2 50 1
2 3 100 2
3 4 50 1
5 0 2
3 0
2 1
4 1
3 1
3 2
5 5
1 2 1 2
2 3 1 2
4 3 1 2
5 3 1 2
1 5 2 1
4 1 3
5 1
5 2
2 0
4 0
*/