package 第七届javab;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
public class 圆舞圈 {
static int n;
static Node arr[];
static int m;
static int MOD = 1000000007;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
arr = new Node[n+1];
for(int i = 1;i<arr.length;i++)
arr[i] = new Node(sc.nextInt(), sc.nextInt(),i);
init();//初始化成一个圈
print();
m = sc.nextInt();
for(int i = 0;i<m;i++){
int k = sc.nextInt();
int p = sc.nextInt();
int Q= sc.nextInt();
if(k==1)
change(p, Q);
if(k==2)
arr[p].F = Q;
if(k==3)
arr[p].H = Q;
caculate();
}
}
static void change(int m,int n){//改变队列,无需考虑多种情况
int mright = arr[m].right.code;
int nleft = arr[n].left.code;
arr[m].right = arr[n];
arr[n].left = arr[m];
arr[nleft].right=arr[mright];
arr[mright].left = arr[nleft];
}
static int caculate(){//找出每个环的,并存入数组中
HashSet<Integer> hashSet = new HashSet<Integer>();
ArrayList<Mery> meries = new ArrayList<Mery>();
for(int i = 1;i<arr.length;i++){
if(!hashSet.contains(i)){
meries.add(new Mery());
Node tmp = arr[i];
Node ttt = arr[i].right;
meries.get(meries.size()-1).ar.add(tmp.code);
while(ttt!=tmp){
hashSet.add(ttt.code);
ttt = ttt.right;
meries.get(meries.size()-1).ar.add(ttt.code);
}
}
}
cacul(meries);
return 1;
}
static void cacul(ArrayList<Mery> meries){//计算动感值
long sum = 0;
for(Mery mery:meries){
for(int i:mery.ar){
Node tmp = arr[i];
Node ttt = arr[i].right;
int co = 1;
while(ttt!=tmp){
sum=(sum+co*tmp.F*ttt.H)%MOD;
ttt = ttt.right;
co++;
}
}
// System.out.println(sum);
}
System.out.println(sum);
}
static void print(){//对每个圈进行输出
HashSet<Integer> hashSet = new HashSet<Integer>();
for(int i = 1;i<arr.length;i++){
if(!hashSet.contains(i)){
Node tmp = arr[i];
Node ttt = arr[i].right;
System.out.print(tmp.code+" ");
while(ttt!=tmp){
System.out.print(ttt.code+" ");
hashSet.add(ttt.code);
ttt = ttt.right;
}
System.out.println("");
}
}
}
static void init(){//对圆圈进行初始化
arr[1].left=arr[arr.length-1];
arr[arr.length-1].right = arr[1];
for(int i = 1;i<arr.length-1;i++){
arr[i].right = arr[i+1];
arr[i+1].left = arr[i];
}
}
}
class Node{//创建节点
Node left;
Node right;
int H;
int F;
int code;//节点所代表的序列值
public Node(int H,int F,int code){
this.H = H;
this.F = F;
this.code = code;
}
@Override
public String toString() {
return H+"";
}
}
class Mery{
ArrayList<Integer> ar = new ArrayList<Integer>();
}
圆圈舞蓝桥
最新推荐文章于 2022-07-07 17:08:11 发布