首页 > 其他分享 >NOIP2015 T3 乱作题解

NOIP2015 T3 乱作题解

时间:2022-10-06 13:00:13浏览次数:82  
标签:NOIP2015 number NN int 题解 T3 long times color

题目

看起来好像不是很难啊,为什么我做不出来呢

1. 暴力枚举

枚举x,y,z的值,再判断是否符合条件 ;
时间复杂度: \(\mathcal{O}(n ^ 3)\)
期望得分:\(20pts\)
\(Code\):

#include <bits/stdc++.h>
using namespace std;

const int N=100010;
long long n,m,ans;
long long color[N],number[N];

int main()
{
	scanf("%lld %lld",&n , &m);
	for(int i=1 ; i<=n ; i++)	scanf("%lld",&number[i]);
	for(int i=1 ; i<=n ; i++)	scanf("%lld",&color[i]);
	
	for(int x=1 ; x<=n ; x++)
	{
		for(int y=x+1 ; y<=n ; y++)
		{
			for(int z=y+1 ; z<=n ; z++)
			{
				if( color[x] == color[z] && y-x == z-y )
					ans += (x+z) * (number[x] + number[z]);
			}
		}
	}
	
	printf("%lld",ans%10007);
}

2.优化暴力枚举

整理条件(\(y-z=z-y\))我们可以发现
$$y = (z+x)\div2$$
也就是说,我们可以通过枚举x,z的值来确定y的值
时间复杂度: \(\mathcal{O}(n ^ 2)\)
期望得分:\(40pts\)
\(Code:\)

#include <bits/stdc++.h>
using namespace std;

const int N=100010;
long long n,m,ans;
long long color[N],number[N];

int main()
{
	scanf("%lld %lld",&n , &m);
	for(int i=1 ; i<=n ; i++)	scanf("%lld",&number[i]);
	for(int i=1 ; i<=n ; i++)	scanf("%lld",&color[i]);
	
	for(int x=1 ; x<=n ; x++)
	{
		for(int z=x+2 ; z<=n ; z+=2)
		{
			int y=(x+z)/2;
			if(color[x] == color[z])
				ans += (x+z) * (number[x] + number[z]);
		}
	}
	
	printf("%lld",ans%10007);
}

3.正解

仔细观察这个式子 $$y = (x+z)\div2$$
因为\(y\)是整数
所以\(x+z\)必定是偶数
也就是说 \(x\)和\(z\)同奇偶
再想想题目(\(color[z]=color[z]……\)

◝(⑅•ᴗ•⑅)◜..°♡ 欸!!瞧瞧我们发现了什么!

\(x\)和\(z\)具有两项相同的性质
整理一下

  • \(x与z同奇偶\)
  • \(color[x] = color[z]\)

这个时候我们就要运用分组思想
————那么 什么是分组思想?

分组思想,就是把具有相同性质的两个集合放在一起,方便计算。
						————沃兹·基朔德

放在这题里就是
先将所有数字按颜色分组,再按奇偶分组(其实先按什么分都一样的啦

显然,每一组中,任意一对x,z都可以构造出一个符合条件的三元组(\(y=(x+z)\div2\))

推式子时间到!

我们不知道从哪搞来了两个数组a,number;

  • a[i]表示某一组内第i个格子的编号
  • number[i]表示某一组内第i个格子表上写的数字
  • k表示组内共有k个格子

那么这个组内的分数应该为

\[(a[1]+a[2])\times(number[1]+number[2])+(a[1]+a[3])\times(number[1]+number[3])+……+(a[2]+a[3])\times(numebr[2]+number[3])+(a[2]+a[4])\times(number[2]+number[4])+……+(a[k-1]+a[k])\times(number[k-1]+number[k]) \]

化简一下可得

\[a[1]\times(number[1]+number[2]+number[1]+number[3]……+number[1]+number[k])+……+a[k]\times(number[1]+number[k]+number[2]+number[k]+……+number[k-1]+number[k]) \]

\[=a[1]\times(number[1]\times(k-2)+number[1]+number[2]+……+number[k])+………+a[k]\times(number[k]\times(k-2)+number[1]+number[2]+……+number[k]) \]

至于计算\(number[1]+number[2]+……+number[k]\)只需要加一个前缀和优化就可以力
那么整张纸条的分数就是将所有分出来的组的分数的总和!!!

有了思路,写代码清晰无比;

时间复杂度:\(\mathcal{O}(n ^ )\)
期望得分:\(100pts\)

\(Code\)

#include <bits/stdc++.h>
using namespace std;

const int NN=100010;
const int MOD = 10007;
long long number[NN]  ,color[NN];
long long sum[NN][2] , k[NN][2];//sum是前缀和数组,k是每组的个数
long long n,m,ans;

int main()
{
	scanf("%d %d" , &n , &m);
	for(int i=1 ; i<=n ; i++)	scanf("%d",&number[i]);
	for(int i=1 ; i<=n ; i++)	scanf("%d",&color[i]);
	
	for(int i=1 ; i<=n ; i++)
	{
		k[color[i]][i%2] ++;
		sum[color[i]][i%2] = (sum[color[i]][i%2] + number[i]) % MOD;
	}
	
	for(int i=1 ; i<=n ; i++)
	{
		ans += i * (number[i] * (k[color[i]][i%2]-2) + sum[color[i]][i%2] );
		ans %= MOD;
	}
	
	printf("%d",ans);
	return 0;
}

By Hu_taooo

标签:NOIP2015,number,NN,int,题解,T3,long,times,color
From: https://www.cnblogs.com/Hutaooo/p/16757354.html

相关文章

  • P2680 [NOIP2015 提高组] 运输计划 (树上差分-边差分)
    P2680题目的大意就是走完m条路径所需要的最短时间(边权是时间),其中我们可以把一条边的权值变成0(也就是题目所说的虫洞)。可以考虑二分答案x,找到一条边,使得所有大于x的路径......
  • 文件系统EXT3,EXT4和XFS的区别
    文件系统EXT3,EXT4和XFS的区别:1.EXT3(1)最多只能支持32TB的文件系统和2TB的文件,实际只能容纳2TB的文件系统和16GB的文件(2)Ext3目前只支持32000个子目录(3)Ext3文件系统使用32位......
  • CF870E题解
    题目大意给你平面上\(n(1\leqslantn\leqslant10^5)\)个点,给出他们的坐标\(x_i,y_i(-10^9\leqslantx_i,y_i\leqslant10^9)\)。对于每个点有三种操作:不进行任何操......
  • P2149 [SDOI2009] Elaxia的路线 题解
    首先考虑分别求出在两个人最短路上的边,这个就是用\(s\)跑一遍最短路,\(t\)跑一遍最短路,然后枚举边\((u,v)\),如果满足\((s\tou)+(u\tov)+(t\tov)=(s\tot)\)那么......
  • 第一道面试题 第一道困难题解答记录
    输入一个奇数n,输出一个由*构成的n阶实心菱形。输入格式一个奇数n。输出格式输出一个由*构成的n阶实心菱形。具体格式参照输出样例。数据范围1≤n≤99输......
  • 贤鱼的刷题日常--P2671 [NOIP2015 普及组] 求和
    ......
  • 【题解】「AGC013D」Piling Up
    传送门题目大意:开始有\(n\)个黑白球在袋子中,但是不知道具体多少黑球白球,有\(m\)次操作,每次从袋子中先拿一个球,再放入一个黑球一个白球,再拿走一个球,求所有初始情况下......
  • 【CS224n】(assignment3)Adam和Dropout
    学习总结(1)adam和dropout是算法岗面试的常考题,下面的问题是源自斯坦福大学NLP的CS224n作业assignment3的2道题。深度学习的优化算法一般分为两类:1)调整学习率,使得优化更加稳定......
  • 【whk】三调生物-缝合小鼠实验——小鼠肥胖原因 题解
    今天生物考试考了个小鼠肥胖原因的题,写个题解((我根据一位不愿意透露姓名的刘佳兴的描述扒下来了一道似乎很类似的题\((1)\)首先开第一问。他给定了限制是两种原因之一,......
  • CF1739 部分题解
    比赛链接:https://codeforces.com/contest/1739AB水题//bySkyRainWind#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algo......