好累哟好难坚持呀(小声BB)
A. 处女座与线性代数
看一下官方题解吧
1.处女座点的数量最多为 1
证明:
2. 若K维空间一个点集{P1,P2,⋯,Pn}则?≤?+?≤??+?
严格的证明需要利用高等代数。但是利用数学归纳法或线性代数方法证明同条件下证明?≤2?+1是显然的。 (提示:将处女座点的定义弱化为向量夹角为钝角或直角后即可证明)
综上所述,若?>?+2则直接输出0,否则暴力检查即可。由于?≤10,用?>2?+1判断也是可以的。
时间复杂度?(?^3)。
第一个条件的推论的过程还是看的懂的,第二个条件高等代数不会。
有了这个数学条件,然后模拟一下就AC了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 1e9+7
#define ffr(i,a,b) for(int i=a;i<b;i++)
#define mem(a,b) memset( a,b,sizeof a)
int n,m,k;
int f[10050][20];
bool juge(int i)
{
int b1,b2;
ll sum=0;
for(b1=0;b1<n;b1++)
{
for(b2=0;b2<n;b2++)
if(b1!=b2&&b2!=i&&b1!=i)
break;
if(b1!=b2 && b2!=i && b1!=i)
break;
}
for(int j=0;j<k;j++)
sum += (f[b1][j]-f[i][j])*(f[b2][j]-f[i][j]);
return sum<0 ? true : false;
}
int main()
{
std::ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
int ans=0;
bool flag=0;
cin>>n>>k;
for(int i=0;i<n;i++)
for(int j=0;j<k;j++)
cin>>f[i][j];
if(n>k+2)
{
cout<<"0"<<endl;
continue;
}
for(int i=0;i<n;i++)
{
if(juge(i))
{
cout<<1<<endl;
flag=1;
for(int j=0;j<k;j++)
cout<<f[i][j]<<" ";
cout<<endl;
break;
}
}
if(!flag)
cout<<"0"<<endl;
}
return 0;
}
B. 处女座的比赛资格
虽然没做 这题,但是我肯定会用spfa然后超时,然后懵。。太久没有写图了,尤其是拓扑排序。但是!!
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define cl(a,b) memset(a,b,sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
const int maxblock=sqrt(maxn)+10;
int n,m;
struct Edge{
int u,v;
ll w;
int next;
}edge[maxm],edge1[maxm];
int head[maxn],head1[maxn];
int tot=0,tot1=0;
int d[maxn],d1[maxn];
vector<int> v,v1;
void init(){
cl(head,-1);
cl(head1,-1);
tot=tot1=0;
v.clear();
v1.clear();
cl(d,0);
cl(d1,0);
}
void addedge(int u,int v,ll w,int ord){
if (!ord){
edge[tot]=Edge{u,v,w,head[u]};
head[u]=tot++;
}
else{
edge1[tot1]=Edge{u,v,w,head1[u]};
head1[u]=tot1++;
}
}
ll dis[maxn];
ll solve(){
queue<int> q;
for (int i=1;i<=n;i++){
if (!d[i]){
q.push(i);
}
}
while (!q.empty()){
int u=q.front();
q.pop();
v.pb(u);
for (int i=head[u];~i;i=edge[i].next){
int V=edge[i].v;
d[V]--;
if (!d[V]){
q.push(V);
}
}
}
cl(dis,0);
for (int i=1;i<=n;i++)
dis[i]=-1*(ll)1e16;
dis[1]=0;
for (int t=0;t<n;t++){
int u=v[t];
for (int i=head[u];~i;i=edge[i].next){
int V=edge[i].v;
dis[V]=max(dis[V],dis[u]+edge[i].w);
}
}
/*for (int i=1;i<=n;i++) cout<<dis[i]<<" ";
cout<<endl;*/
return dis[n];
}
ll solve1(){
queue<int> q;
for (int i=1;i<=n;i++){
if (!d1[i]){
q.push(i);
}
}
while (!q.empty()){
int u=q.front();
q.pop();
v1.pb(u);
for (int i=head1[u];~i;i=edge1[i].next){
int V=edge1[i].v;
d1[V]--;
if (!d1[V]){
q.push(V);
}
}
}
cl(dis,0);
for (int i=1;i<=n;i++)
dis[i]=-1*(ll)1e16;
dis[1]=0;
for (int t=0;t<n;t++){
int u=v1[t];
for (int i=head1[u];~i;i=edge1[i].next){
int V=edge1[i].v;
dis[V]=max(dis[V],dis[u]+edge1[i].w);
}
}
/*for (int i=1;i<=n;i++) cout<<dis[i]<<" ";
cout<<endl;*/
return dis[n];
}
int main(){
int t;
scanf("%d",&t);
while (t--){
scanf("%d %d",&n,&m);
init();
for (int i=1;i<=m;i++){
int u,v;
ll c,w1,w2;
scanf("%d %d %lld %lld %lld",&u,&v,&c,&w1,&w2);
ll c1=w1-c;
ll c2=w2-c;
//if (v==1) continue;
addedge(u,v,c1,0);
addedge(u,v,c2,1);
d[v]++;
d1[v]++;
}
ll d1,d2;
d1=solve();
d2=solve1();
//cout<<d1<<" "<<d2<<endl;
if (d2>0) d2=0;
if (d1>0) d1=0;
if (d2<d1){
printf("cnznb!!!\n");
printf("%lld\n",d1-d2);
}
else if (d2==d1){
printf("oof!!!\n");
}
else if (d2>d1){
printf("rip!!!\n");
printf("%lld\n",d2-d1);
}
}
return 0;
}
C. 处女座点名
大水题
D.处女座的训练
曾经写过类似的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 1e9+7
#define ffr(i,a,b) for(int i=a;i<b;i++)
#define mem(a,b) memset( a,b,sizeof a)
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
ll n,m;
struct node
{
ll time,p;
};
bool cmp(node a,node b)
{
return a.p*b.time>b.p*a.time;
}
node f[100050];
int main()
{
std::ios::sync_with_stdio(false);
cin>>n;
ll sum_time=0,sum_p=0,ans=0;
for(int i=0;i<n;i++)
{
cin>>f[i].time>>f[i].p;
sum_time+=f[i].time;
sum_p+=f[i].p;
}
sort(f,f+n,cmp);
for(int i=0;i<n;i++)
{
sum_time-=f[i].time;
sum_p-=f[i].p;
ans+=f[i].time*sum_p;
}
cout<<ans<<endl;
return 0;
}
注意好cmp就行了。
E.处女座和小姐姐
简单模拟
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 1e9+7
#define ffr(i,a,b) for(int i=a;i<b;i++)
#define mem(a,b) memset( a,b,sizeof a)
ll n,m;
int main()
{
std::ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
ll ans=0;
cin>>n>>m;
if(m&1)
ans=n*(m-1)+n-2;
else
ans=n*(m-1)-1;
cout<<ans<<endl;
}
return 0;
}
F.处女座和小姐姐二
…
G.处女座和小姐姐三
简单的模板数位dp。
结果WA了自我检讨中
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[20][2];
int a[20],cnt=0;
ll dfs(int pos,int limit,int is6){
if (pos==-1){
if(is6) return 1;
return 0;
}
if (!limit&&dp[pos][is6]!=-1)
return dp[pos][is6];
ll ans=0;
int up=limit?a[pos]:9;
for (int i=0;i<=up;i++){
if (i==6){
ans+=dfs(pos-1,limit&&(i==up),1);
}
else ans+=dfs(pos-1,limit&&(i==up),is6);
}
if (!limit){
dp[pos][is6]=ans;
}
return ans;
}
ll solve(ll x){
if (x==-1) return 0;
cnt=0;
memset(dp,-1,sizeof dp);
while (x){
a[cnt++]=x%10;
x/=10;
}
return dfs(cnt-1,1,0);
}
int main(){
ll l,r;
scanf("%lld %lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-1));
return 0;
}
H.处女座的百日理财计划
官方题解:
怎么说
我懒
I.处女座的约会
真的坑爹。。。
J. 处女座的比赛
…