自從第一次打了AT 差一題AK,後面的AT 總是差兩題,唉。。好菜啊
E - Multiplication 4
題意:給你n個數,要求選出k個值 使得k個值得乘積最大。
做法:記得做過類似得題,也是超出long long 求乘積最大,好像是用了log 判斷大小。但這裏有負數 就不太好搞了。
做法參考來自:博客
思路感覺很對,但是他代碼交。wa在了 after_contest_01.txt, 大概就是被hack了。想了半天感覺沒什麼問題啊,不知道爲什麼wa了。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline ll read()
{
ll x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
const ll mod=1e9+7;
const int N=2e5+10;
ll a[N],n,k;
vector<ll>G1,G2;
bool cmp2(ll x,ll y)
{
return abs(x)<abs(y);
}
bool cmp1(ll x,ll y)
{
return x>y;
}
bool cmp3(ll x,ll y)
{
return x<y;
}
void run1()
{
//puts("***");
sort(G1.begin(),G1.end(),cmp1);
sort(G2.begin(),G2.end(),cmp3);
// for(ll v:G1) printf("%lld ",v);puts("");
// for(ll v:G2) printf("%lld ",v);puts("");
int id1=0,id2=0;
ll ans=1;
while(id1+1<G1.size()&&id2+1<G2.size()&&id1+id2+2<=k){
//printf("id1:%d id2:%d\n",id1,id2);
if(G1[id1]*G1[id1+1]>G2[id2]*G2[id2+1]){
ans=ans*G1[id1]%mod*G1[id1+1]%mod;
id1+=2;
}
else{
ans=ans*G2[id2]%mod*G2[id2+1]%mod;
id2+=2;
}
}
//printf("id1:%d id2:%d sz:%d\n",id1,id2,G1.size());
while(id2+1<G2.size()&&id1+id2+2<=k){
ans=ans*G2[id2]%mod*G2[id2+1]%mod;
id2+=2;
}
while(id1<G1.size()&&id1+id2+1<=k){
ans=ans*G1[id1]%mod;
id1+=1;
}
//if(id1+id2<k) ans=ans*G1[id1++]%mod;
printf("%lld\n",(ans+mod)%mod);
}
int main()
{
n=read(),k=read();
int zero=0;
rep(i,1,n)
{
a[i]=read();
if(a[i]>0) G1.emplace_back(a[i]);
else if(a[i]<0) G2.emplace_back(a[i]);
else zero++;
}
if(G2.size()-(G2.size()&1)+G1.size()>=k&&(k&1)<=G1.size()){
run1();
}
else if(zero){
puts("0");
}
else{
sort(a+1,a+1+n,cmp2);
ll ans=1;
rep(i,1,k) ans=ans*a[i]%mod;
printf("%lld\n",(ans+mod)%mod);
}
}
/*
6 4
-1 -2 -3 1 2 3
*/
F - Intervals on Tree
題意:看了半天都沒怎麼懂的題意。大概就是 枚舉l、r 然後集合包括[l,r]內的數。問集合內的聯通塊是多少,並求和輸出。
做法:參考來自:博客
很妙的做法。。。容斥的方法
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
long long ans=0;
for(int i=1;i<=n;i++){
ans+=(long long)(n-i+1)*i;
}
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
if(a>b)swap(a,b);
ans-=(long long)a*(n-b+1);
}
cout<<ans<<endl;
return 0;
}