UVA 512 - Spreadsheet Tracking 模拟 WA了一天,莫名其妙的A了

这个题我WA到第10次的时候气得我睡觉去了

以前的写法是把操作和源格子都存起来,每一步操作对所有格子都做一遍,总共只做一遍操作

AC的写法是把操作存起来,来一个格子就做一遍操作

道理上都是一样的,第一种写法死活过不去,拿着代码仓库里面的UVA512.in做输入和标答对了一遍,一模一样,绝对是in不够的缘故

除了EX操作之外,对输入的一串操作数排序,在上面二分找小于等于当前值的个数,比直接一个个比要快一些

图方便把4个操作写在一起了,简洁嘛。

代码:

#include 
#include 
#include 
#include 

using namespace std;
using pa=pair;

vector com;
vector> opn;
vector tv;//temporary vector
string str;
int kcase=1,npa,ncom,a,r,c;
pa p,ans;
vector::iterator bsearch(vector::iterator le,vector::iterator ri,int value);

int main(){
	ios_base::sync_with_stdio(false);
	while(cin>>r>>c&&r+c){
		if(kcase-1)
			cout<>ncom;
		for(int i=0;i>str;
			com.push_back(str);
			if(str=="EX"){
				tv.resize(4);
				for(int& x:tv)cin>>x;
				opn.push_back(tv);
			}
			else{
				cin>>a;
				tv.resize(a);
				for(int& x:tv)cin>>x;
				sort(tv.begin(),tv.end());
				opn.push_back(tv);
			}
		}

		cin>>npa;
		while(npa--){
            cin>>p.first>>p.second;
            ans=p;
            for(int i=0;iint&{return f?ans.first:ans.second;};
                if(ans.first==-1||ans.second==-1)
                    i=ncom;
                else{
                    if(tfun()opn[i].back())
                        tfun()+=sym*opn[i].size();
                    else{
                        auto it=bsearch(opn[i].begin(),opn[i].end()-1,tfun());
                        if(sym==-1&&tfun()==*it)
                            tfun()=-1;
                        else
                            tfun()+=sym*(it-opn[i].begin()+1);
                    }
                }
            }

            cout<<"Cell data in ("<::iterator bsearch(vector::iterator le,vector::iterator ri,int value){
    auto mid=le;
    while(ri>le){
        mid=le+((ri+1-le)>>1);
        if(*mid<=value)
            le=mid;
        else
            ri=mid-1;
    }
    return le;
}



你可能感兴趣的:(模拟)