为什么去掉了一个判断,反而会多TLE一个点……

P2671 [NOIP2015 普及组] 求和

@[林空鹿饮溪](/space/show?uid=28563) 第一,新版Markdown换行需要空行 第二,麻烦把您的代码用代码块框起来,这样谁都看不见
by fbhou @ 2018-07-20 15:57:43


[点我学习Markdown](https://www.luogu.org/wiki/show?name=帮助:markdown)
by Melon_Musk @ 2018-07-20 16:08:30


@[fbhou](/space/show?uid=65589) 哦哦,谢谢提醒,没怎么用过讨论版
by 林空鹿饮溪 @ 2018-07-20 16:08:35


int n,m,ans=0; struct node{ int color,num; }a[100010];//记录读入数据 vector<int> color[100010];//给不同颜色的下标分类 int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i].num; for(int i=1;i<=n;i++) cin>>a[i].color;//读入 for(int i=1;i<=n;i++) color[a[i].color].push_back(i);//预处理 for(int i=1;i<=m;i++)//枚举颜色 for(int j=0;j<color[i].size();j++)//枚举x for(int k=j+1;k<color[i].size();k++){//枚举z int jj=color[i][j],kk=color[i][k]; if(jj<kk&&!((jj+kk)%2))//判断 ans=(ans+(jj%10007+kk%10007)%10007*(a[jj].num%10007+a[kk].num%10007)%10007)%10007;//求和 } cout<<ans<<endl;//输出 return 0; } 以上,TLE(80').中途出现了两个问题: (1)一开始以为x&z不是下标,是方格里的值,那样每一行就可能是无序的,所以用了一个sort.后来把预处理的地方改对了,但是忘了删sort,再加上求余处理的不好,所以AC(40')+TLE(40')+WA(20'超出int范围,变为负); (2)也是第一个问题衍生的.删除了sort以后,没有想到下标存入时,本来就是有序的,所以在判断时多加了一个if(jj<kk)的语句.后来优化程序的时候,注意到了这一点,就把这句话删掉了,于是,可怕的事情发生了——本来以为去了一个判断,就算不能再过一个点,也不会把原来得分的点丢掉,但事实就是这样的——TLE(80')->TLE(70')……(而且不止是一个点,有好几个点,都出现了优化前比优化后耗时少的情况)「·为什么少了一个判断,反而会耗时更长?待解答!·」
by 林空鹿饮溪 @ 2018-07-20 16:13:40


代码块内并不需要空行啊。。。用"```"框起来就好了
by fbhou @ 2018-07-20 16:28:12


@[fbhou](/space/show?uid=65589) ```cpp int n,m,ans=0; struct node{ int color,num; }a[100010];//记录读入数据 vector<int> color[100010];//给不同颜色的下标分类 int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i].num; for(int i=1;i<=n;i++) cin>>a[i].color;//读入 for(int i=1;i<=n;i++) color[a[i].color].push_back(i);//预处理 for(int i=1;i<=m;i++)//枚举颜色 for(int j=0;j<color[i].size();j++)//枚举x for(int k=j+1;k<color[i].size();k++){//枚举z int jj=color[i][j],kk=color[i][k]; if(jj<kk&&!((jj+kk)%2))//判断 ans=(ans+(jj%10007+kk%10007)%10007*(a[jj].num%10007+a[kk].num%10007)%10007)%10007;//求和 } cout<<ans<<endl;//输出 return 0; } ``` 以上,TLE(80').中途出现了两个问题: (1)一开始以为x&z不是下标,是方格里的值,那样每一行就可能是无序的,所以用了一个sort.后来把预处理的地方改对了,但是忘了删sort,再加上求余处理的不好,所以AC(40')+TLE(40')+WA(20'超出int范围,变为负); (2)也是第一个问题衍生的.删除了sort以后,没有想到下标存入时,本来就是有序的,所以在判断时多加了一个if(jj<kk)的语句.后来优化程序的时候,注意到了这一点,就把这句话删掉了,于是,可怕的事情发生了——本来以为去了一个判断,就算不能再过一个点,也不会把原来得分的点丢掉,但事实就是这样的——TLE(80')->TLE(70')……(而且不止是一个点,有好几个点,都出现了优化前比优化后耗时少的情况)「·为什么少了一个判断,反而会耗时更长?待解答!·」 ****这里想求教的是(2),望大神解答:)
by 林空鹿饮溪 @ 2018-07-20 16:48:02


|