文章目录
题目
A. New Year and Naming
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s1[25],s2[25];
int main(){
ll n,m,q;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
cin>>s1[i];
}
for(int i=1;i<=m;i++){
cin>>s2[i];
}
scanf("%lld",&q);
while(q--){
ll k;
scanf("%lld",&k);
cout<<s1[(k-1)%n+1]<<s2[(k-1)%m+1]<<endl;
}
}
B. New Year and Ascent Sequence
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll MAXN=1e5+10;
ll a[MAXN];
vector<ll>MIN,MAX;
int main(){
ll n;
scanf("%lld",&n);
ll ex=0;
for(ll i=1;i<=n;i++){
ll k;
scanf("%lld",&k);
ll Min=INF;
ll Max=-1;
bool flag=false;
for(int j=1;j<=k;j++){
scanf("%lld",&a[j]);
}
for(ll j=1;j<=k;j++){
if(a[j]>Min){
ex++;
flag=true;
break;
}
Min=min(Min,a[j]);
Max=max(Max,a[j]);
}
if(!flag){
MIN.push_back(Min);
MAX.push_back(Max);
}
}
ll ans=0;
sort(MIN.begin(),MIN.end());
sort(MAX.begin(),MAX.end());
for(auto it=MIN.begin();it!=MIN.end();it++){
ll dis=MAX.end()-upper_bound(MAX.begin(),MAX.end(),*it);
ans+=dis;
}
ans+=ex*n+ex*(n-ex);
cout<<ans<<endl;
}
C. New Year and Permutation
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=250000+10;
ll p[maxn];
int main(){
ll n,mod;
scanf("%lld%lld",&n,&mod);
p[0]=1;
for(ll i=1;i<=n;i++){
p[i]=p[i-1]*i%mod;
}
ll ans=0;
for(ll i=1;i<=n;i++){
ans=(ans+(((n-i+1)*p[i]%mod)*p[n-i+1]%mod))%mod;
}
printf("%lld\n",ans);
return 0;
}
D. New Year and Conference
按sa,ea排序,判断事件在a道相交时在b道是否一定相交,然后反过来判断在b道相交时在a道是否一定相交
判断方法为建立两个集合,分别存放b道的开始时间和结束事件,按照排序好的时间顺序,通过扫描线,在加入a道开始点的时候,分别在两个在集合中加入对应地b道的事件开始点和结束点,扫描到a道结束点的时候删除两个集合中b道对应的点。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int sa[maxn],sb[maxn],ea[maxn],eb[maxn];
int n;
bool solve(){
vector<pair<int,int> >vec;
for(int i=1;i<=n;i++){
vec.push_back(make_pair(sa[i],-i));
vec.push_back(make_pair(ea[i],i));
}
sort(vec.begin(),vec.end());
multiset<int>s,e;
for(int i=0;i<vec.size();i++){
if(vec[i].second<0){
s.insert(sb[-vec[i].second]);
e.insert(eb[-vec[i].second]);
if(s.size()&&(*s.rbegin()>eb[-vec[i].second]||*e.begin()<sb[-vec[i].second]))
return false;
}
else{
s.erase(s.find(sb[vec[i].second]));
e.erase(e.find(eb[vec[i].second]));
}
}
return true;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&sa[i],&ea[i],&sb[i],&eb[i]);
}
bool flag=true;
if(!solve())
flag=false;
swap(sa,sb);
swap(ea,eb);
if(!solve())
flag=false;
if(flag)
puts("YES");
else
puts("NO");
}
E. New Year and Castle Construction
计算几何不是特别懂,但要学会极角排序呢,很重要的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
const long double pi=acos(-1.0L);
struct node{
int x,y;
}p[maxn];
vector<long double>vec;
int main(){
ll n;
scanf("%lld",&n);
for(int i=0;i<n;i++){
scanf("%lld%lld",&p[i].x,&p[i].y);
}
ll ans=n*(n-1)*(n-2)*(n-3)*(n-4)/24;
for(ll i=0;i<n;i++){
vec.clear();
for(int j=0;j<n;j++){
if(i!=j){
long double tmp=atan2(p[j].x-p[i].x,p[j].y-p[i].y);
vec.push_back(tmp);
vec.push_back(tmp+2*pi);
}
}
sort(vec.begin(),vec.end());
for(ll j=0;j<n-1;j++){
ll p=lower_bound(vec.begin(),vec.end(),vec[j]+pi)-vec.begin()-j;
ans-=(p-1)*(p-2)*(p-3)/6;
}
}
cout<<ans<<endl;
}