【题解】 [COCI2010-2011#7] GITARA
作者:互联网
题目传送门:
https://www.luogu.com.cn/problem/P6704
题解 P6704 【[COCI2010-2011#7] GITARA】
题目描述中已经把大意说的很清楚了~
分析
弦数固定只有六根,然后就是考虑每根弦上的操作:对于每一个音调,必须保证在它前面已经被按下的段落中其段数最大。由此,我们可以考虑维护六个栈结构,每个栈代表一根弦。进栈时,如果栈尾的段数比即将进栈的 j 大,栈尾出栈,直到栈尾的段数小于等于将要进栈的段数 j,若小于,新段数进栈,若等于,转向下一个要求 (i,j)。其实就是一个很直接的模拟啦~
分析完成,接下来上代码!
Code
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,p; 4 int a[6][500005],q[6];//a数组代表栈,p数组指向对应的每个栈的栈尾 5 int ans=0; 6 int main() 7 { 8 scanf("%d%d",&n,&p); 9 int x,y; 10 for(int i=1;i<=n;i++){ 11 scanf("%d%d",&x,&y); 12 x--;//为了节省空间将所有的弦数减一储存 13 while(a[x][q[x]]>y){//栈尾段数较大的出栈 14 q[x]--; 15 ans++; 16 } 17 if(a[x][q[x]]<y){//新元素进站(需要动手指呦~) 18 a[x][++q[x]]=y; 19 ans++; 20 } 21 } 22 printf("%d",ans); 23 return 0; 24 }
完结撒fa~
标签:栈尾,int,题解,段数,GITARA,进栈,2011 来源: https://www.cnblogs.com/unknown-year/p/13760508.html