天天看點

圓圈舞藍橋

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>();
}